home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / rbbs_pc / 173c_bas.zip / SOURCE / RBBS-PC.BAS < prev    next >
BASIC Source File  |  1991-09-01  |  152KB  |  4,729 lines

  1. 3 ' $linesize: 132
  2. 4 ' $title: 'RBBS-PC 17.3C, Copyright 1991 by D. Thomas Mack'
  3. 5 ' WARNING !!! DO NOT CHANGE, BYPASS OR Remove LINES 3-29
  4. 9 'by D. Thomas Mack, 39 Cranbury Drive, Trumbull, CT 06611 (up to 16)
  5.    '  Jon Martin, 4396 N Prairie Willow Ct, Concord, CA 94521 (up to 17.2B)
  6.    '  Ken Goosens, 5020 Portsmouth Road, Fairfax, VA 22032
  7.    '  Doug Azzarito, 2399 NW 30th Road, Boca Raton, FL 33431
  8. 13 '
  9. 14 ' *******************************NOTICE*************************************
  10. 15 ' *  A limited license is granted to all users of this program and it's    *
  11. 16 ' *  companion program, CONFIG (version 17.3C), to make copies of this     *
  12. 17 ' *  program and distribute the copies to other users, on the following    *
  13. 18 ' *  conditions:                                                           *
  14. 19 ' *    1.   The notices contained in lines 3 through 29 of the program     *
  15. 20 ' *         are not altered, bypassed, or removed.                         *
  16. 21 ' *    2.   The program is not to be distributed to others in modified     *
  17. 22 ' *         form (i.e. the line numbers must remain the same).             *
  18. 23 ' *    3.   No fee is to be charged (or any other consideration received)  *
  19. 24 ' *         for copying or distributing these programs without an express  *
  20. 25 ' *         written agreement with the authors.                            *
  21. 27 ' *                                                                        *
  22. 28 ' *       Copyright (c) 1983-1991 D. Thomas Mack, The Second Ring          *
  23. 29 ' **************************************************************************
  24.    '
  25.    ' $INCLUDE: 'RBBS-VAR.BAS'
  26.    '
  27.    ' $SUBTITLE: 'Main-line RBBS-PC Program'
  28.     ZCrLf$ = CHR$(13) + CHR$(10)
  29.     WasJ = 60
  30.     DIM ZOptSec(WasJ)
  31.     ZConfigFileName$ = "RBBS-PC.DEF"
  32.     CALL GetCommand (ZDebug,NetTime$,ZNetBaud$,ZNetReliable$)
  33.     ZSubParm = -62
  34.     ZBulletinMenu$ = ""
  35.     CALL ReadDef (ZConfigFileName$)
  36.     IF ZErrCode > 0 THEN _
  37.        GOTO 31
  38.     CALL MLInit (1)
  39.     GOTO 100
  40. 31  ZSnoop = ZTrue
  41.     CALL PScrn ("Configuration "+ZConfigFileName$+" missing/improper format") : _
  42.     GOTO 204
  43. 100 CLEAR,,ZSizeOfStack
  44.     DEF SEG                            ' Point to BASIC
  45.     WIDTH 80                           ' Set Screen Width
  46.     KEY OFF                            ' Line 25 turned off
  47. ' ********************* Variable Definitions *******************************
  48. 102 ZMsgDim = 99
  49.     WasMM = 999
  50.     WasBX = 75
  51.     WasJ = 60
  52.     REDIM ZOptSec(WasJ)
  53.     DIM ZWorkAra$(WasJ)
  54.     DIM ZGSRAra$(WasJ)
  55.     DIM ZCategoryName$(WasBX),ZCategoryCode$(WasBX),ZCategoryDesc$(WasBX)
  56.     DIM ZOutTxt$(ZMsgDim)                      ' Message line table
  57.     DIM ZUserIn$(ZMsgDim)                      ' Message line table
  58.     DIM ZMsgPtr(WasMM,2)                       ' Message pointers
  59.     CALL VarInit
  60. 105 ZVersionID$ = "17.3C"
  61. 106 CALL GetCommand (ZDebug,NetTime$,ZNetBaud$,ZNetReliable$)
  62.     ZSubParm = 1
  63.     CALL ReadDef (ZConfigFileName$)
  64.     IF ZErrCode > 0 THEN _
  65.        GOTO 31
  66.     REDIM ZWorkAra$(ZMaxWorkVar)
  67.     REDIM ZGSRAra$(ZMaxWorkVar)
  68.     ZUseTPut = (ZUpperCase OR ZXOnXOff)
  69.     OrigUpgradeSec = ZAutoUpgradeSec
  70.     ZOrigCallers$ = ZCallersFile$
  71.     ZOrigMsgFile$ = ZMainMsgFile$
  72.     ZOrigUserFile$ = ZMainUserFile$
  73.     OrigMainSec = ZMinLogonSec
  74.     ZOrigSysopFN$ = ZSysopFirstName$
  75.     ZOrigSysopLN$ = ZSysopLastName$
  76.     ZExpertUser = ZExpertUserDef
  77.     ZPromptBell = ZPromptBellDef
  78.     CALL BreakFileName (ZOrigMsgFile$,Drive$,OrigMsgName$,ZWasY$,ZFalse)
  79.     IF OrigMsgName$ = "MESSAGES" THEN _
  80.        OrigMsgName$ = "MAIN" _
  81.     ELSE IF RIGHT$(OrigMsgName$,1) = "M" THEN _
  82.             OrigMsgName$ = LEFT$(OrigMsgName$,LEN(OrigMsgName$)-1)
  83.     ConfFileName$ = OrigMsgName$
  84.     OrigNewsFileName$ = ZWelcomeFileDrvPath$ + _
  85.               OrigMsgName$ + ".NWS"
  86.     ZNewsFileName$ = OrigNewsFileName$
  87.     IF ZNetMail$ <> "NONE" AND VAL(NetTime$) > 0 THEN _
  88.        ZLimitMinsPerSession = VAL(NetTime$)
  89.     IF ZNetMail$ <> "NONE" AND VAL(ZNetBaud$) > 0 THEN _
  90.        ZExpectActiveModem = ZTrue : _
  91.        IF NOT ZKeepInitBaud THEN _
  92.           ZModemInitBaud$ = ZNetBaud$
  93.     IF ZFossil THEN _
  94.        ZComPort = VAL(RIGHT$(ZComPort$,1)) - 1 : _
  95.        IF ZComPort < 0 THEN _
  96.           GOTO 108 _
  97.        ELSE CALL FOSinit(ZComPort,Result) : _
  98.             IF Result = -1 THEN _
  99.                ZSnoop = ZTrue : _
  100.                CALL PScrn("ERROR INITIALIZING FOSSIL") : _
  101.                GOTO 204
  102. 108 CALL BreakFileName (ZCallersFile$,Drive$,WasX$,ZWasY$,ZTrue)
  103.     ZCallersFilePrefix$ = WasX$
  104.     ZNodeWorkDrvPath$ = Drive$
  105.     ZArcWork$ = ZNodeWorkDrvPath$ + _
  106.                 "ARCWORK" + _
  107.                 ZNodeFileID$ + _
  108.                 ".DEF"
  109.     IF ZUseBASICWrites THEN _
  110.        ZLocalBksp$ = ZBackArrow$ _
  111.     ELSE ZLocalBksp$ = ZBackSpace$
  112.     ZSysopFullName$ = LEFT$(ZSysopFirstName$ + " " + ZSysopLastName$ + "  ",22)
  113.     ZFastFileSearch = ZFalse
  114.     CALL FindIt (ZFastFileList$)
  115.     IF ZOK THEN _
  116.        CALL FindIt (ZFastFileLocator$) : _
  117.        IF ZOK THEN _
  118.           ZFastFileSearch = ZTrue : _
  119.           CALL BreakFileName (ZFastFileList$, Drive$,WasX$,ZWasY$,ZTrue) : _
  120.           ZFileName$ = Drive$ + WasX$ + "T" + ZWasY$ : _
  121.           CALL FindIt (ZFileName$) : _
  122.           IF ZOK THEN _
  123.              CALL OpenRSeq (ZFileName$, WasX, WasY, 72) : _
  124.              FIELD 2, 72 AS IndexRec$ : _
  125.              GET 2, 1 : _
  126.              ZFastTabs$ = IndexRec$ : _
  127.              CLOSE 2 _
  128.           ELSE ZFastTabs$ = ""
  129. '
  130. ' *****  INITIALIZE NetBIOS INTERFACE   ****
  131. '
  132.    IF ZNetworkType = 6 AND NOT ZSubBoard THEN _
  133.       CALL InitIBM
  134. '
  135. ' *****  ESTABLISH NEXT CALLERS FILE RECORD AVAILABLE   ***
  136. '
  137.     CALL SetCall
  138. 112 IF NOT ZSubBoard THEN _
  139.        ZLocalUser = ZTrue : _
  140.        ZOutTxt$ = ZColorReset$ : _
  141.        ZSubParm = 1 : _
  142.        CALL TPut : _
  143.        ZLocalUser = ZFalse
  144.     ZUpldDriveFile$ = RIGHT$(ZDnldDrives$,1)+":FREESPAC.UPL"
  145.     MinsPerSessionDef = ZMinsPerSession
  146.     MaxPerDayDef = ZMaxPerDay
  147. '
  148. ' *****  TEST FOR MESSAGE FILE PRESENT (Abort IF NOT PRESENT)  ****
  149. '
  150. 135 IF ZCurDef$ = ZOrigCnfg$ THEN _
  151.        ZActiveMessageFile$ = ZMainMsgFile$ : _
  152.        ZActiveUserFile$ = ZMainUserFile$
  153.     GOSUB 4910
  154.     IF ZConfMode THEN _
  155.        GOTO 150
  156.     ZLocalUserMode = (RIGHT$(ZComPort$,1) < "1")
  157.     GET 1,ZNodeRecIndex
  158.     ZWasY$ = MID$(ZMsgRec$,77,2)
  159.     CALL UnPackDate (ZWasY$,WasX,WasL,WasI,ZOldDate$)
  160.     ZOldDate$ = LEFT$(ZOldDate$,6) + MID$(STR$(WasX),2)
  161.     ZHourMinToDropToDos = - (ZHourMinToDropToDos > 0) * ZHourMinToDropToDos
  162.     Hour = INT(ZHourMinToDropToDos / 100)
  163.     WasMN = ZHourMinToDropToDos - Hour * 100
  164.     ZTimeToDropToDos! = Hour * 3600! + WasMN * 60!
  165. '
  166. ' ******  TEST FOR TIMED EXIT ACTIVE   *****
  167. '
  168. 140 IF ZHourMinToDropToDos > 0 AND _
  169.        ZOldDate$ <> DATE$ AND _
  170.        TIMER >= ZTimeToDropToDos! AND _
  171.        TIMER < 86340 THEN _
  172.           GOTO 206
  173. '
  174. ' **** GET CURRENT STATUS OF SYSOP AVAIL, SYSOP ANNOY, SYSOP NEXT, & PRINTER
  175. '
  176. 150 IF ZSubBoard THEN _
  177.        GOSUB 12987 : _
  178.        GOSUB 5135 : _
  179.        GOTO 170
  180.     ZSysopAvail = VAL(MID$(ZMsgRec$,32,2))
  181.     ZSysopAnnoy = VAL(MID$(ZMsgRec$,34,2))
  182.     ZSysopNext = VAL(MID$(ZMsgRec$,36,2))
  183.     MID$(ZMsgRec$,36,2) = STR$(ZFalse)
  184.     ZPrinter = VAL(MID$(ZMsgRec$,38,2))
  185.     IF ZTurnPrinterOff THEN _
  186.        ZPrinter = ZFalse
  187.     ZExitToDoors = (MID$(ZMsgRec$,40,2) = "-1" AND ZNetBaud$ = "")
  188.     ZEightBit = VAL(MID$(ZMsgRec$,42,2))
  189.     ZBPS = VAL(MID$(ZMsgRec$,44,2))
  190.     ZSnoop = VAL(MID$(ZMsgRec$,58,2))
  191.     MID$(ZMsgRec$,57,1) = "I"
  192.     ZPrivateDoor = (MID$(ZMsgRec$,72,2) = "-1")
  193.     IF ZPrivateDoor THEN _
  194.        ZHasPrivDoor = ZTrue
  195.     MID$(ZMsgRec$,72,2) = STR$(ZFalse)
  196.     ZLocalUser = (MID$(ZMsgRec$,101,2) = ZCarriageReturn$+ZCarriageReturn$) OR _
  197.                  ZLocalUserMode
  198.     IF ZExitToDoors OR ZPrivateDoor THEN _
  199.        ZHasDoored = ZTrue : _
  200.        TurboLogon = ZTrue
  201.     PUT 1,ZNodeRecIndex
  202.     GOSUB 12985
  203.     GET 1,1
  204.     CallsToDate! = VAL(MID$(ZMsgRec$,11,10))
  205.     IF CallsToDate! < 11 THEN _
  206.        CALL CopyRight
  207. '
  208. ' *****  INITIALIZE VOICE SYNTHESIZER   ****
  209. '
  210.     CALL Talk (Init,ZOutTxt$)
  211. '
  212. ' *****  TEST FOR MULTI LINK PRESENT IF NOT COMPAQ COMPUTER   ****
  213. '
  214. 160 CALL MLInit (4)
  215. 170 FOR FunctionKeyIndex = 1 TO 10
  216.        KEY FunctionKeyIndex,""
  217.     NEXT
  218.     CALL LoadNew (ZMsgPtr())
  219. '
  220. ' ******  INITIALIZE FILE MANAGEMENT SYSTEM, CHECK FOR LOCAL BBS MODE
  221. '
  222. 175 GOSUB 5344
  223.     CALL CountLines (MaxEntries)
  224.     REDIM ZCategoryName$(MaxEntries),ZCategoryCode$(MaxEntries),_
  225.           ZCategoryDesc$(MaxEntries)
  226.     CALL InitFMS (ZNumCategories)
  227.     ZMaxMsgLines = ZMaxMsgLinesDef
  228.     IF (NOT ZLocalUser) AND (NOT ZSubBoard) THEN _
  229.        CALL OpenCom (ZModemInitBaud$,",N,8,1")
  230.     IF NOT ZSubBoard THEN _
  231.        CALL SetEcho (ZDefaultEchoer$)
  232.     ZNodeWorkFile$ = ZNodeWorkDrvPath$ + _
  233.                       "NODE" + _
  234.                       ZNodeFileID$ + _
  235.                       "WRK"
  236.     ZSecsPerSession! = ZMinsPerSession * 60!
  237.     IF NOT ZLocalUserMode THEN _
  238.        IF NOT ZExitToDoors THEN _
  239.           GOTO 180 _
  240.        ELSE IF NOT ZLocalUser THEN _
  241.                GOTO 180
  242.     ZLocalUser = ZTrue
  243.     ZBPS = -6
  244.     ZBaudTest! = 9600
  245.     ZEightBit = ZTrue
  246.     ZSnoop = ZTrue
  247.     LogIndex = 1
  248.     IF ZExitToDoors THEN _
  249.        CALL AMorPM : _
  250.        CALL ReadProf : _
  251.        GOTO 410
  252.     GOSUB 178
  253.     GOTO 345
  254. 178 IF NOT ZSubBoard THEN _
  255.        RETURN
  256.     IF ZNewUser THEN _
  257.        GOSUB 758
  258.     IF ZFirstName$ = ZSysopFirstName$ AND _
  259.        ZLastName$ = ZSysopLastName$ THEN _
  260.           RETURN 832 _
  261.     ELSE RETURN 790
  262. 180 ZSubParm = 2
  263.     CALL Line25
  264.     GOSUB 178
  265. '
  266. ' ******  WAIT FOR THE PHONE TO RING AND ANSWER IT   ****
  267. '
  268.     ZSubParm = 1
  269. 200 ZToggleOnly = ZTrue
  270.     CALL AnswerIt
  271.     GET 1,ZNodeRecIndex
  272.     ZSnoop = VAL(MID$(ZMsgRec$,58,2))
  273.     ZToggleOnly = ZFalse
  274.     IF ZErrCode > 1 THEN _
  275.        GOTO 13000
  276.     IF ZSubParm < 0 THEN _
  277.        GOTO 202
  278.     ON ZSubParm GOTO   410, _   '  1 = ANSWERED PHONE & CARRIER FOUND
  279.                        330, _   '  2 = CARRIER FOUND BEFORE ANSWERING
  280.                        822, _   '  3 = Sysop GETS SYSTEM NEXT
  281.                      10595, _   '  4 = ANSWERED PHONE BUT NO CARRIER
  282.                      13540, _   '  5 = NOT USED
  283.                        202, _   '  6 = LOCAL SYSOP KEY PRESSED
  284.                        206, _   '  7 = TIME TO DROP TO DOS
  285.                      13538      '  8 = ZNo CALLS! TIME TO RECYCLE
  286. 202 ZFF = -ZSubParm
  287.     ON ZFF GOTO 10595, _   '  -1 = CARRIER DROPPED
  288.                  4770, _   '  -2 = SYSOP INITIATED CHAT
  289.                   205, _   '  -3 = FORCE SYSTEM TO ANSWER THE PHONE
  290.                   204, _   '  -4 = EXIT TO DOS IMMEDEATELY
  291.                   203, _   '  -5 = EXIT TO DOS AFTER CLEAN-UP
  292.                 10698, _   '  -6 = INDICATE ACCESS IS DENIED AND LOGOFF USER
  293.                 10620      '  -7 = UPDATE CALLERS FILE AND LOGOFF USER
  294. 203 CALL MLInit(3)
  295. 204 IF Zfossil THEN _
  296.        CALL FOSExit(ZComPort)
  297.     SYSTEM
  298. 205 ZSubParm = 4
  299.     GOTO 200
  300. 206 CALL TimedOut
  301.     GOTO 203
  302. 330 CALL Carrier
  303.     IF ZSubParm = -1 THEN _
  304.        GOTO 10595
  305.     CALL EofComm (Char)
  306.     IF Char = -1 THEN _
  307.        GOTO 335
  308.     CALL FlushCom (ZWasDF$)
  309.     IF ZSubParm = -1 THEN _
  310.         GOTO 10595
  311.     GOTO 330
  312. 335 ZExitToDoors = ZFalse
  313.     ZPrivateDoor = ZFalse
  314.     IF ZWasCL <> 1 THEN _
  315.        LOCATE 22,34
  316.     WasD$ ="CONNECT" + _
  317.         STR$(ZBaudTest!) + _
  318.         "     "
  319.     GOSUB 1315
  320. '
  321. ' *****  DISPLAY WELCOME LINE  ****
  322. '
  323. 345 LOCATE 24,1
  324.     CALL AMorPM
  325.     ZUserLogonTime! = TIMER
  326.     ZTimeLoggedOn$ = TIME$
  327.     ZLinesPrinted = 0
  328.     ZExpertUserDef = ZExpertUser
  329.     ZExpertUser = ZFalse
  330.     CALL SetExpert
  331.     ZOutTxt$ = ""
  332.     IF NodesInSystem > 1 THEN _
  333.        ZOutTxt$ = " - Node " + ZNodeID$
  334.     IF ZReliableMode THEN _
  335.        ZOutTxt$ = ZOutTxt$ + " (Reliable)"
  336.     CALL QuickTPut1 ("Welcome to " + ZRBBSName$ + ZOutTxt$)
  337.     ZTestParity = ZTrue
  338.     ZStopInterrupts = ZTrue
  339.     ZFileName$ = ZPreLog$
  340.     CALL FlushCom (WasX$)
  341.     ZCommPortStack$ = ""
  342. 346 GOSUB 466
  343.     IF ZSubParm = -1 THEN _
  344.        GOTO 13540
  345.     ZFF = ZFalse
  346. '
  347. ' *****  GET USER NAME
  348. ' *****  C - COMMAND FROM NEWUSER REGISTER OPTIONS (CHANGE NAME OR ADDRESS)
  349. '
  350. 400 CALL SkipLine(1)
  351.     ZEscapeInsecure = ZFalse
  352.     ZUpperCase = ZFalse
  353.     ZExpertUser = ZExpertUserDef
  354.     CALL SetExpert
  355.     WasA1$ = "What is your "
  356.     GOSUB 12500
  357.     CALL CommInfo
  358.     IF ZFF THEN _
  359.        ZLogonErrorIndex = 1 : _
  360.        GOTO 10620
  361.     IF ZMinOldCallerBaud > ZBaudTest! THEN _
  362.        CALL QuickTPut1 ("Sorry," + STR$(ZBaudTest!) + " BPS not allowed") : _
  363.        ZWasLG$(7) = "OLD CALLER BAUD RESTRICTION" : _
  364.        ZLogonErrorIndex = 7 : _
  365.        GOTO 10620
  366.     LogIndex = 4 - (ZLenIndiv > 0 AND ZStartIndiv > 0)
  367.     TurboLogon = (LEFT$(ZUserIn$(LogIndex),1) = "!")
  368.     SkipWelcomeScreen = (LEFT$(ZUserIn$(LogIndex),1) = "$")
  369.     ZHomeConf$ = RIGHT$(ZUserIn$(LogIndex),LEN(ZUserIn$(LogIndex)) _
  370.                      + (TurboLogon OR SkipWelcomeScreen))
  371.     CALL AllCaps(ZHomeConf$)
  372. '
  373. ' *****  CHECK IF SAME USER ON ANOTHER NODE   ***
  374. '
  375. 410 IF ZExitToDoors THEN _
  376.        ZCurDate$ = MID$(ZMsgRec$,119,2) + _
  377.                        "-" + _
  378.                        MID$(ZMsgRec$,121,2) + _
  379.                        "-" + _
  380.                        MID$(ZMsgRec$,123,2) : _
  381.        ZTime$ = MID$(ZMsgRec$,125,2) + _
  382.               ":" + _
  383.               RIGHT$(ZMsgRec$,2) : _
  384.        IF LEFT$(ZTime$,2) < "12" THEN _
  385.           ZTime$ = ZTime$ + _
  386.                  " AM" _
  387.        ELSE ZTime$ = ZTime$ + _
  388.                    " PM"
  389.     NodeIndex = 2
  390.     WasXX = NodesInSystem + 1
  391.     WasX$ = LEFT$(ZActiveUserName$+"  ",30)
  392. 412 IF NodeIndex > WasXX THEN _
  393.        GOTO 430
  394.     GET 1,NodeIndex
  395.     IF INSTR(ZMsgRec$,WasX$) THEN _
  396.        GOTO 420
  397.     NodeIndex = NodeIndex + 1
  398.     GOTO 412
  399. 420 IF MID$(ZMsgRec$,57,1) = "A" THEN _
  400.        ZLogonErrorIndex = 6 : _
  401.        ZWasLG$(6) = ZWasLG$(6) + _
  402.                 LEFT$(ZMsgRec$,25) : _
  403.        ZOutTxt$ = "The name '" + ZActiveUserName$ + _
  404.                   "' is in use on another node" : _
  405.        CALL RingCaller : _
  406.        GOTO 10620
  407.     ZFirstName$ = LEFT$(ZMsgRec$,INSTR(ZMsgRec$, " ") - 1)
  408.     IF NOT ZPrivateDoor THEN _
  409.        CALL SkipLine (1) : _
  410.        CALL QuickTPut1 (ZFirstName$ + ", welcome back!") : _
  411.        CALL Talk (11,ZOutTxt$)
  412.     IF ZExitToDoors THEN _
  413.        GOTO 457
  414. '
  415. ' *****  TEST FOR REMOTE SYSOP LOGGING ON   ***
  416. '
  417. 430 GET 1,ZNodeRecIndex
  418.     SameUser = (ZActiveUserName$ = LEFT$(ZMsgRec$,LEN(ZActiveUserName$)))
  419. '
  420. ' *****  TEST FOR SYSOP NAME ATTEMPT  ***
  421. '
  422. 445 IF INSTR(ZActiveUserName$,"SYSOP") OR _
  423.        INSTR(ZActiveUserName$,ZSysopFirstName$ + " " + ZSysopLastName$) THEN _
  424.        ZLogonErrorIndex = 2 : _
  425.        GOTO 10620
  426. '
  427. ' *****  REMOVE INVALID CHARACTERS FROM USER NAME  ***
  428. '
  429. 455 CALL BadChar (ZActiveUserName$)
  430.     IF ZActiveUserName$ = "" THEN _
  431.        GOTO 400
  432. '
  433. ' ****  CHECK FOR ACTIVE USER   ***
  434. '
  435. 457 CALL SkipLine (1)
  436.     GOSUB 12840
  437.     GOSUB 12850
  438.     GOSUB 12598
  439.     GOSUB 11482
  440.     CALL CompDate (TodayRegYY,TodayRegMM,TodayRegDD,TodayComputeDate!)
  441.     IF NOT Found THEN _
  442.        GOTO 700
  443.     GOSUB 12984
  444. '
  445. ' *****  ACTIVE USER FOUND  ****
  446. '
  447. 459 GOSUB 9500
  448.     ZLastDateTimeOnSave$ = ZLastDateTimeOn$
  449.     IF ZExitToDoors THEN _
  450.        TempHoldTime! = VAL(LEFT$(ZTime$,2))*3600! + _
  451.                          VAL(MID$(ZTime$,4,2))*60! : _
  452.        CALL CheckTime(TempHoldTime!, TempTime!, 2) : _
  453.        ZMinsInDoors = TempTime! / 60 : _
  454.        CALL TimeRemain (MinsRemaining)
  455.     ZUserFileIndex = LOC(5)
  456.     GOSUB 5135
  457. '
  458. ' ***  COMPUTE THE NUMBER OF DAYS REMAINING UNTIL REGISTRATION EXPIRES **
  459. '
  460.     IF ZRestrictByDate AND ZDaysInRegPeriod > 0 THEN _
  461.        CALL CompDate (ZUserRegYY,ZUserRegMM,ZUserRegDD,UserComputeDate!) : _
  462.        ZRegDaysRemaining = UserComputeDate! + _
  463.                             ZDaysInRegPeriod - _
  464.                             TodayComputeDate! : _
  465.        CALL ExpireDate (UserComputeDate!,ZDaysInRegPeriod,ZExpirationDate$) _
  466.     ELSE ZDaysInRegPeriod = 0
  467.     IF NOT ZPrivateDoor THEN _
  468.        IF ZRegDaysRemaining < 0 AND ZDaysInRegPeriod > 0 THEN _
  469.        IF ZUserSecLevel > ZExpiredSec THEN _
  470.           CALL QuickTPut1 (ZWasLG$(9) + _
  471.                       " - security level set to" + _
  472.                       STR$(ZExpiredSec)) : _
  473.           CALL BufFile(ZHelpPath$+"RGXPIRD"+ZHelpExtension$,WasX) : _
  474.           ZLogonErrorIndex = 9 : _
  475.           ZUserSecLevel = ZExpiredSec : _
  476.           LSET ZSecLevel$ = MKI$(ZUserSecLevel) : _
  477.           GOSUB 5135
  478. 460 UserSecLevel$ = STR$(ZUserSecLevel)
  479.     IF ZUserSecLevel > -1 THEN _
  480.        UserSecLevel$ = MID$(UserSecLevel$,2)
  481.     IF ZUserSecLevel >= ZMinLogonSec THEN _
  482.        GOTO 470
  483.     IF NOT ZPrivateDoor THEN _
  484.        GOSUB 465 : _
  485.        CALL DelayTime (8 + ZBPS)
  486.     IF ZLogonErrorIndex < 9 AND _
  487.        ZErrCode = 0 THEN _
  488.        ZLogonErrorIndex = 8
  489.     GOTO 10620
  490. '
  491. ' ***  DISPLAY LOG-ON MESSAGE FOR SPECIFIC SECURITY LEVEL  **
  492. '
  493. 465 TurboLogon = TurboLogon AND (ZExitToDoors OR _
  494.                   (ZUserSecLevel >= ZAllowCallerTurbo))
  495.     IF TurboLogon THEN _
  496.        RETURN
  497.     ZFileName$ = ZWelcomeFileDrvPath$ + _
  498.                  "LG" + _
  499.                  UserSecLevel$ + _
  500.                  ".DEF"
  501.     CALL Graphic (ZUserGraphicDefault$,ZFileName$)
  502. 466 ZStopInterrupts = ZTrue
  503.     ZBypassTimeCheck = ZTrue
  504.     CALL BufFile (ZFileName$,WasX)
  505.     RETURN
  506. 470 GOSUB 12989
  507.     ZWasCI$ = ZCityState$
  508.     CALL Trim (ZWasCI$)
  509.     ZAttemptsAllowed = 4
  510.     ZPswdSave$ = ZPswd$
  511.     TempSysop = (ZUserSecLevel >= ZSysopSecLevel)
  512.     ZMsgPswd = ZFalse
  513.     IF NOT ZSubBoard THEN _
  514.        ZElapsedTime = CVI(ZElapsedTime$)
  515.     IF (NOT ZExitToDoors) AND _
  516.        (ZCurDate$ <> LEFT$(ZLastDateTimeOn$,8)) AND _
  517.        (ZElapsedTime > 0 OR NOT ZKeepTimeCredits) THEN _
  518.        ZElapsedTime = 0
  519.     IF ZPrivateDoor AND _
  520.        ZTransferFunction = 3 THEN _
  521.        GOSUB 755 : _
  522.        GOTO 800
  523.     IF ZPswdSave$ = SPACE$(LEN(ZPswdSave$)) THEN _
  524.        GOSUB 755 : _
  525.        GOTO 800
  526. 480 CALL SetSysOp
  527.     IF ZPrivateDoor OR (ZWasA AND ZEscapeInsecure) OR ZDoorSkipsPswd THEN _
  528.        ZWasZ$ = ZPswdSave$ : _
  529.        ZPswdFailed = 0 : _
  530.        GOTO 644
  531.     ZSubParm = 4
  532.     CALL PassWrd
  533.     LogonPswdFailed = ZPswdFailed
  534.     ZAnsIndex = LogIndex
  535. 643 IF NOT LogonPswdFailed THEN _
  536.        GOSUB 41070 _
  537.     ELSE IF NOT ZExitToDoors THEN _
  538.        ZFirstName$ = "" : _
  539.        GOTO 902
  540. 644 ZNewUser = ZFalse
  541.     WasWK$ = RIGHT$(STR$(ASC(MID$(ZListNewDate$,2))),2) + _  ' MM
  542.            "/" + _
  543.            RIGHT$(STR$(ASC(MID$(ZListNewDate$,3))),2) + _    ' DD
  544.            "/" + _
  545.            RIGHT$(STR$(ASC(ZListNewDate$)),2)                ' YY
  546.     ZWasLM$ = RIGHT$(WasWK$,2) + _                           ' YY
  547.           LEFT$(WasWK$,2) + _                                ' MM
  548.           MID$(WasWK$,4,2)                                   ' DD
  549.     IF MID$(ZWasLM$,3,1) = " " THEN _
  550.        MID$(ZWasLM$,3,1) = "0"
  551. 655 IF MID$(ZWasLM$,5,1) = " " THEN _
  552.        MID$(ZWasLM$,5,1) = "0"
  553. 660 CALL Muzak (1)
  554.     GOTO 800
  555. 670 GOSUB 12570
  556.     IF Found THEN _
  557.        GOSUB 12984 : _
  558.        RETURN 12595
  559.     RETURN
  560. '
  561. ' ****  ACTIVE USER NOT FOUND (NEWUSER ROUTINE)  ***
  562. '
  563. 700 ZExpertUser = ZFalse
  564.     CALL SetExpert
  565.     IF ZMinNewCallerBaud > ZBaudTest! THEN _
  566.        CALL QuickTPut ("Sorry," + STR$(ZBaudTest!) + _
  567.                        " BPS only for registered users",1) : _
  568.        ZWasLG$(7) = "NEW CALLER BAUD RESTRICTION" : _
  569.        ZLogonErrorIndex = 7 : _
  570.        GOTO 10620
  571.     CALL QuickTPut1 ("User not found")
  572.     ZLastIndex = 0
  573.     GOSUB 12558
  574.     IF ZNo THEN _
  575.        GOSUB 12990 : _
  576.        GOTO 400
  577.     CALL Line25
  578.     ZWasZ$ = ZFirstName$
  579.     GOSUB 670
  580.     ZWasZ$ = ZLastName$
  581.     GOSUB 670
  582.     ZWasZ$ = ZActiveUserName$
  583.     GOSUB 670
  584.     TurboLogon = ZFalse
  585. 710 IF ZUserFileIndex = 0 AND NOT ZSurviveNoUserRoom THEN _
  586.        GOTO 13540
  587. 720 CALL SetSysOp
  588.     IF ZWasA THEN _
  589.        ZUserSecLevel = ZSysopSecLevel _
  590.     ELSE ZUserSecLevel = ZDefaultSecLevel
  591. 725 IF ZUserSecLevel < ZMinLogonSec THEN _
  592.        ZLogonErrorIndex = 1 : _
  593.        GOTO 460
  594.     IF ZFirstName$ = ZLastName$ THEN _
  595.        CALL QuickTPut1 (ZFirstNamePrompt$+"/"+ZLastNamePrompt$+" cannot be same") : _
  596.        ZLogonErrorIndex = 3 : _
  597.        GOTO 10620
  598.     IF NOT ZRememberNewUsers THEN _
  599.        GOSUB 13700 : _
  600.        ZUserFileIndex = 0 : _
  601.        GOSUB 12960: _
  602.        PrevLastOn$ = "00-00-00": _
  603.        GOTO 735
  604.     ZNewUser = ZTrue
  605.     CALL OpenUser (HighestUserRecord)
  606.     GOSUB 9450
  607.     GOSUB 12630
  608.     MID$(ZUserRecord$,ZStartHash,ZLenHash) = LEFT$("NEWUSER",ZLenHash)
  609.     IF ZStartIndiv > 0 THEN _
  610.        MID$(ZUserRecord$,ZStartIndiv,ZLenIndiv) = ZIndivValue$
  611.     GOSUB 9440
  612. 730 GOSUB 12960
  613. 735 ZBypassTimeCheck = ZTrue
  614.     GOSUB 758
  615. 739 CALL QuickTPut1 (ZActiveUserName$ + " from " + ZWasCI$)
  616. 740 ZOutTxt$ = "C)hange "+ZFirstNamePrompt$+"/"+ZLastNamePrompt$+"/"+ZUserLocation$+", D)isconnect, [R]egister"
  617.     GOSUB 12995
  618.     IF ZWasQ = 0 THEN _
  619.        ZWasZ$ = "R" _
  620.     ELSE CALL AraAllCaps (ZUserIn$(),1) : _
  621.          ZWasZ$ = ZUserIn$(1)
  622.     ZWasS = INSTR("CDR",ZWasZ$)
  623. 745 IF NOT ZRememberNewUsers THEN _
  624.        ON ZWasS GOTO 748,752,754
  625.     ON ZWasS GOTO 747,750,760
  626.     GOTO 740
  627. 747 CALL UpdtCalr (ZActiveUserName$ + " from " + ZWasCI$ + _
  628.                            " changed Name/Address",2)
  629.     MID$(ZUserRecord$,ZStartHash,ZLenHash) = STRING$(ZLenHash,0)
  630.     GOSUB 9440
  631.     GOSUB 12991
  632. 748 ZFF = ZFalse
  633.     GOTO 400
  634. '
  635. ' ***  D - COMMAND FROM NEWUSER ROUTINE (DISCONNECT - REFUSE TO REGISTER) **
  636. '
  637. 750 CALL UpdtCalr (ZActiveUserName$ + " from " + ZWasCI$ + _
  638.                            " didn't register",2)
  639.     MID$(ZUserRecord$,ZStartHash,ZLenHash) = STRING$(ZLenHash,0)
  640.     GOSUB 9440
  641.     GOSUB 12991
  642. 752 ZFF = ZFalse
  643.     ZUserFileIndex = 0
  644.     GOTO 13540
  645. '
  646. ' *****  GET AND VERIFY PASSWORD   ****
  647. '
  648. 754 CALL QuickTPut1 ("GUEST privileges granted.  Re-register on future calls")
  649.     ZUserSecSave = ZUserSecLevel
  650.     GOTO 832
  651. 755 IF ZPrivateDoor THEN _
  652.        ZUserIn$ = ZPswd$ : _
  653.        ZWasZ$ = ZUserIn$ : _
  654.        RETURN
  655.     GOSUB 12800
  656.     ZOutTxt$ = "Re-Enter password for Verification"
  657.     GOSUB 45010
  658.     SWAP ZWasZ$,ZUserIn$
  659.     CALL AllCaps (ZWasZ$)
  660.     IF ZUserIn$ <> ZWasZ$ THEN _
  661.        CALL QuickTPut1 ("Passwords Don't Match!") : _
  662.        GOTO 755
  663.     RETURN
  664. 758 CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  665.     CALL Line25
  666.     ZFileName$ = ZNewUserFile$
  667.     ZStopInterrupts = ZTrue
  668.     GOSUB 1790
  669.     CALL SkipLine(1)
  670.     RETURN
  671. '
  672. ' ***  R - COMMAND FROM NEWUSER ROUTINE - REGISTER   **
  673. '
  674. 760 GOSUB 755
  675.     CALL AllCaps (ZWasZ$)
  676.     LSET ZPswd$ = ZWasZ$
  677.     CALL QuickTPut1 ("Please REMEMBER your password")
  678.     ZUserTextColor = 37
  679.     ZTempSecLevel = ZUserSecLevel
  680.     CALL Protocol
  681.     ZUserXferDefault$ = "N"
  682.     ZProtoPrompt$ = "None"
  683.     IF ZNewUserSetsDefaults THEN _
  684.        ZBypassTimeCheck = ZTrue : _
  685.        GOSUB 43000 : _
  686.        ZBypassTimeCheck = ZFalse : _
  687.        CALL Graphic (ZUserGraphicDefault$,ZFileName$) : _
  688.        GOSUB 42805 : _
  689.        GOSUB 42700 _
  690.     ELSE ZUpperCase = ZFalse : _
  691.          ZHiLiteOff = ZTrue : _
  692.          CALL SetGraphic (0,ZUserGraphicDefault$) : _
  693.          ZNulls = ZFalse
  694.     ZPageLength = ZPageLengthDef
  695.     GOSUB 12900
  696.     GOSUB 5135
  697.     CALL DefaultU
  698. 790 IF NOT ZNewUser THEN _
  699.        GOTO 800
  700.     ZFileName$ = ZNewUserQuestionnaire$
  701.     GOSUB 11520
  702.     LSET ZSecLevel$ = MKI$(ZUserSecLevel)
  703.     UserSecLevel$ = STR$(ZUserSecLevel)
  704.     CALL Remove (UserSecLevel$," ")
  705. '
  706. ' ****  LOGIN ALL USERS  ***
  707. '
  708. 800 IF ZAdjustedSecurity THEN _
  709.        GOSUB 5135
  710.     IF ZOrigCnfg$ = ZCurDef$ THEN _
  711.        ZMainUserFileIndex = ZUserFileIndex : _
  712.        ZOrigSec = ZUserSecLevel : _
  713.        ZUserSecSave = ZUserSecLevel : _
  714.        ZOrigUserName$ = ZActiveUserName$
  715.     ZTimesLoggedOn = CVI(MID$(ZUserOption$,1,2)) - _
  716.        ((ZOrigCnfg$ <> ZCurDef$ OR NOT ZSubBoard) AND _
  717.         (NOT ZPrivateDoor) AND (NOT ZExitToDoors))
  718.     GOSUB 9500
  719.     IF (NOT ZExitToDoors) AND (NOT ZSubBoard) THEN _
  720.        CALL UpdtCalr (ZActiveUserName$ + " from " + ZWasCI$ + _
  721.                  " Lvl" + STR$(ZUserSecLevel) + " " + TIME$,2)
  722.     PrevLastOn$ = ZLastDateTimeOn$
  723.     IF ZLocalUser THEN _
  724.        ZTalkToModemAt$ = "9600" : _
  725.        ZBaudParity$ = "9600 BPS,N,8,1" : _
  726.        ZModemInitBaud$ = "9600" : _
  727.        ZSnoop = ZTrue : _
  728.        ZLineFeeds = ZTrue
  729.     CALL SetCrLf
  730.     CALL SetPrompt
  731.     CALL XferType (2,ZTrue)
  732.     IF NOT ZSubBoard THEN _
  733.        BoardCheckDate$ = PrevLastOn$
  734.     CALL SetSysOp
  735.     IF ZWasA THEN _
  736.        ZActiveUserName$ = "SYSOP" : _
  737.        ZFirstName$ = "SysOp"
  738.     IF ZExitToDoors OR ZSubBoard THEN _
  739.        GOTO 815
  740.     GOSUB 465
  741.     IF (ZEightBit AND _
  742.        ZAutoDownDesired) OR _
  743.        ZAskID THEN _
  744.        CALL TestUser
  745.     CALL QuickTPut1 ("Logging " + ZActiveUserName$)
  746.     CALL Talk (1,ZOutTxt$)
  747.     Temp$ = STR$(ZBaudTest!) + MID$(ZBaudParity$,INSTR(ZBaudParity$," B"))
  748.     CALL QuickTPut1 ("RBBS-PC " + ZVersionID$ + " Node " + ZNodeID$ + _
  749.                 ", operating at" + Temp$)
  750.     CALL SkipLine (1)
  751.     Attempts = 0
  752.     ZWasZ$ = ZActiveUserName$ + _
  753.             " on at " + _
  754.             ZCurDate$ + _
  755.             ", " + _
  756.             ZTime$ + _
  757.             " from " + _
  758.             ZWasCI$ + _
  759.             "," + Temp$
  760.      ZWasNG$ = ZWasZ$ + SPACE$(128 - LEN(ZWasZ$))
  761. '
  762. ' *  ALWAYS RECORD THE HASH/INDIVIDUATING FIELD TO EACH RECORD LOGGED OUT
  763. '
  764.      WasX$ = "{" + _
  765.           HashValue$ + _
  766.           "/" + _
  767.           ZIndivValue$ + _
  768.           "}"
  769.      IF LEN(ZWasZ$) < 65 THEN _
  770.         WasX = 65 _
  771.      ELSE WasX = LEN(ZWasZ$) + 2
  772.      MID$(ZWasNG$,WasX) = WasX$
  773.      CALL Printit ("  " + ZWasZ$)
  774.      IF ZNewUser THEN _
  775.         CALL UpdtCalr ("NEWUSER",1) : _
  776.         CALL Muzak (2)
  777. '
  778. ' *****  NOTIFY CALLER IF ABLE TO "AUTODOWN"  ****
  779. '
  780.     IF ZEightBit AND ZAutoDownYes THEN _
  781.        ZOutTxt$ = CHR$(9) + _
  782.             ZReturnLineFeed$ + _
  783.             "You may use AUTODOWNLOADing!" : _
  784.        CALL RingCaller : _
  785.        CALL DelayTime(4)
  786. 815 CALL SetUserUpDn
  787.     IF ZCurDate$ <> LEFT$(ZLastDateTimeOnSave$,8) THEN  _
  788.        ZDLToday! = 0 : _
  789.        ZBytesToday! = 0
  790.     CALL SetGlobalUpDn
  791.     GOSUB 827
  792.     LSET ZUserOption$ = MKI$(ZTimesLoggedOn) + _
  793.                          MID$(ZUserOption$,3)
  794.     LSET ZLastDateTimeOn$ = ZCurDate$ + _
  795.                               " " + _
  796.                               ZTimeLoggedOn$
  797.     MID$(ZUserRecord$,ZStartHash,ZLenHash) = HashValue$
  798.     IF ZStartIndiv > 0 THEN _
  799.        MID$(ZUserRecord$,ZStartIndiv,ZLenIndiv) = ZIndivValue$
  800.     LSET ZUserName$ = ZOrigUserName$
  801.     IF (NOT ZExitToDoors) AND NOT (ZOrigMsgFile$ = ZActiveMessageFile$ AND ZSubBoard) THEN _
  802.        CALL AutoPage
  803.     IF NOT ZSubBoard THEN _
  804.        ZOrigUserFileIndex = ZUserFileIndex
  805.     IF NOT ZConfMode THEN _
  806.        IF ZOrigDateTimeOn$ = "" THEN _
  807.           ZOrigDateTimeOn$ = ZLastDateTimeOn$ : _
  808.           ZOrigTimeLoggedOn$ = ZTimeLoggedOn$ _
  809.        ELSE ZLastDateTimeOn$ = ZOrigDateTimeOn$ :
  810.             ZTimeLoggedOn$ = ZOrigTimeLoggedOn$
  811.     GOSUB 9440
  812.     GOSUB 12991
  813.     GOSUB 41000
  814.     CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  815.     IF TurboLogon THEN _
  816.        GOTO 819
  817.     IF SkipWelcomeScreen AND _
  818.        (ZUserSecLevel >= ZAllowCallerTurbo) THEN _
  819.        GOTO 816
  820.     IF NOT SameUser THEN _
  821.        ZStopInterrupts = NOT ZWelcomeInterruptable : _
  822.        ZBypassTimeCheck = ZTrue : _
  823.        ZFileName$ = ZWelcomeFile$ : _
  824.        ZDisplayAsUnit = ZTrue : _
  825.        GOSUB 1790 : _
  826.        ZDisplayAsUnit = ZFalse
  827.     ZBypassTimeCheck = ZFalse
  828.     ZStopInterrupts = ZTrue
  829. 816 IF NOT ZNewUser THEN _
  830.        CALL QuickTPut1 ("Times on:" + STR$(ZTimesLoggedOn) + _
  831.             "  Last on: " + PrevLastOn$)
  832. 817 IF NOT ZRemindFileXfers OR ZNewUser THEN _
  833.        GOTO 818
  834.     ZOutTxt$ = "Files Downloaded:" + _
  835.          STR$(ZDnlds) + _
  836.          "  Uploaded:" + _
  837.          STR$(ZUplds)
  838.     GOSUB 12977
  839.     CALL CheckRatio (ZFalse)
  840. 818 CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  841.     IF ZRemindProfile THEN _
  842.        GOSUB 5400 : _
  843.        CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  844. 819 CALL Trim (ZWasCI$)
  845.     IF (ZNodeRecIndex < 2) THEN _
  846.        GOTO 821
  847.     GOSUB 4910
  848.     GOSUB 24000
  849.     GET 1,ZNodeRecIndex
  850.     MID$(ZMsgRec$,1,31) = ZActiveUserName$ + _
  851.                                  SPACE$(31 - LEN(ZActiveUserName$))
  852.     MID$(ZMsgRec$,40,2) = " 0"
  853.     MID$(ZMsgRec$,44,2) = STR$(ZBPS)
  854.     MID$(ZMsgRec$,55,2) = " 0"
  855.     MID$(ZMsgRec$,57,1) = "A"
  856.     MID$(ZMsgRec$,60,5) = ZTalkToModemAt$ + _
  857.                                  SPACE$(5 - LEN(ZTalkToModemAt$))
  858.     MID$(ZMsgRec$,72,2) = " 0"
  859.     MID$(ZMsgRec$,93,24) = ZWasCI$ + _
  860.                                   SPACE$(24)
  861.     PUT 1,ZNodeRecIndex
  862.     GOSUB 12985
  863. 821 IF ZExitToDoors THEN _
  864.        IF ZTransferFunction = 3 THEN _
  865.           ZNewUser = ZTrue : _
  866.           TurboLogon = ZFalse : _
  867.           SameUser = ZFalse : _
  868.           ZTransferFunction = 0 : _
  869.           GOTO 832 _
  870.        ELSE GOTO 832
  871.     GOSUB 1241
  872.     IF (ZSubBoard AND (ZOrigMsgFile$ = ZActiveMessageFile$)) _
  873.        OR ((ZUserSecLevel > ZMaxRegSec) AND (NOT ZNewUser)) THEN _
  874.        GOTO 832
  875.     ZWasZ$ = ZRegProgram$
  876.     ZTransferFunction = 3
  877.     CALL DoorExit (ZFalse)
  878.     ZTransferFunction = 0
  879.     GOTO 832
  880. '
  881. ' ****  ESC PRESSED ON LOCAL CONSOLE ENTERS HERE   ***
  882. '
  883. 822 LOCATE 24,1
  884.     CALL TakeOffHook
  885.     ZLocalUser = ZTrue
  886.     ZSnoop = ZTrue
  887.     ZBPS = -6
  888.     CALL CommInfo
  889.     CALL Muzak (2)
  890.     IF NOT ZEscapeInsecure THEN _
  891.        GOTO 345
  892.     ZActiveUserName$ = ZSysopPswd1$ + " " + ZSysopPswd2$
  893.     ZFirstName$ = ZSysopPswd1$
  894.     ZLastName$ = ZSysopPswd2$
  895.     ZUserLogonTime! = TIMER
  896.     ZTimeLoggedOn$ = TIME$
  897.     ZLinesPrinted = 0
  898.     ZSysop = ZTrue
  899.     GOTO 457
  900. 825 WasX = (ZMaxPerDay - ZMinsPerSession)
  901.     WasX = -WasX * (WasX > 0)    ' extra from daily max
  902.     ZWasQ! = WasX + ZMinsPerSession + (ZMaxPerDay > 0) * ZElapsedTime
  903.     IF ZWasQ! > ZMinsPerSession THEN _
  904.        ZWasQ! = ZMinsPerSession
  905.     ZSecsPerSession! = ZWasQ! * 60 + ZTimeCredits!
  906.     RETURN
  907. 827 IF ZLastMsgRead > HighMsgNumber THEN _
  908.        ZLastMsgRead = 0 : _
  909.        MID$(ZUserOption$,3,2) = MKI$(0)
  910.     RETURN
  911. 832 IF ZRestrictByDate AND ZDaysInRegPeriod > 0 THEN _
  912.        IF ZRegDaysRemaining <= ZDaysToWarn AND _
  913.           ZRegDaysRemaining > 0 AND ZUserSecLevel > ZExpiredSec THEN _
  914.              CALL QuickTPut1 ("Registration EXPIRES in" + _
  915.                        STR$(ZRegDaysRemaining) + " days!") : _
  916.              CALL BufFile(ZHelpPath$+"RGXPIRE"+ZHelpExtension$,WasX) : _
  917.              IF NOT ZOK THEN CALL DelayTime (5)
  918.     IF (NOT ZReqQuesAnswered) AND _
  919.        ZReqQues$ <> "" THEN _
  920.          ZFileName$ = ZReqQues$ : _
  921.          GOSUB 11520 : _
  922.          IF ZOK THEN _
  923.             ZReqQuesAnswered = ZTrue
  924. 842 GOSUB 825
  925.     ZSysop = (ZUserSecLevel >= ZSysopSecLevel)
  926.     GOSUB 12987
  927.     IF ZSubBoard THEN _
  928.        GOTO 850
  929.     GOSUB 12986
  930.     GOSUB 23000
  931.     CallsToDate! = CallsToDate! + 1 + (ZSysop OR ZHasDoored)
  932.     GOSUB 24000
  933.     GOSUB 12985
  934. 850 ZSubParm = 2
  935.     CALL Line25
  936.     CALL SkipLine (1)
  937.     IF TurboLogon THEN _
  938.        ZBulletinSave$ = ZBulletinMenu$ : _
  939.        GOSUB 9750 : _
  940.        GOTO 900
  941.     CALL CountNewFiles (BoardCheckDate$,ZMsgPtr(),LastNew,ZOutTxt$)
  942.     IF ZFMSDirectory$ <> "" THEN _
  943.        CALL QuickTPut1 (ZOutTxt$ + STR$(LastNew) + " NEW file(s) since last on") _
  944.     ELSE GOTO 852
  945.     IF ZNewUser OR LastNew < 1 OR NOT ZNewFilesCheck THEN _
  946.        GOTO 852
  947.     WasL = LEN(ZDnldDrives$)
  948.     SecNum = 19
  949.     IF (NOT ZSkipFilesLogon) AND _
  950.        ZUserSecLevel >= ZOptSec(SecNum) THEN _
  951.           ZOutTxt$ = "Review new files to download ([Y],N)" : _
  952.           GOSUB 12999 : _
  953.           IF NOT ZNo THEN _
  954.              ZLastIndex = 3 : _
  955.              ZAnsIndex = 1 : _
  956.              ZWasQ = 3 : _
  957.              ZUserIn$(2) = MID$(BoardCheckDate$,1,2) + _
  958.                      MID$(BoardCheckDate$,4,2) + _
  959.                      MID$(BoardCheckDate$,7,2) : _
  960.              ZWasY$ = ZUserIn$(3) : _
  961.              CALL BreakFileName (ZFMSDirectory$,DR$,ZWasY$,WasX$,ZFalse) : _
  962.              ZUserIn$(3) = ZWasY$ : _
  963.              TimeLockExempt = ZTrue : _
  964.              GOSUB 20185 : _
  965.              ZLastIndex = 0 : _
  966.              TimeLockExempt = ZFalse
  967. 852 ZStopInterrupts = ZFalse
  968.     ZSysop = (ZUserSecLevel >= ZSysopSecLevel)
  969.     IF ZUserSecLevel < ZOptSec (2) OR _
  970.        ZActiveBulletins < 1 OR _
  971.        ZSysop OR _
  972.        SameUser THEN _
  973.           GOTO 900
  974.     IF ZBulletinMenu$ = ZBulletinSave$ THEN _
  975.         GOTO 900
  976.     ZBulletinSave$ = ZBulletinMenu$
  977. 855 CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  978.     IF ZBulletinsOptional AND NOT ZNewUser THEN _
  979.        GOTO 856
  980.     ZStopInterrupts = ZTrue
  981.     ZNewUser = ZFalse
  982.     GOSUB 9700
  983.     ZStopInterrupts = ZFalse
  984.     GOTO 900
  985. 856 IF NOT ZCheckBulletLogon THEN _
  986.        ZAnsIndex = 0 : _
  987.        GOSUB 9760 : _
  988.        GOTO 900
  989.     CALL SkipLine (1)
  990.     ZOutTxt$ = "Skip the bulletins (Y,[N])"
  991.     GOSUB 12999
  992.     IF ZYes THEN _
  993.        GOTO 900
  994. 860 ZNewUser = ZFalse
  995.     GOSUB 9700
  996. 900 ZNewUser = ZFalse
  997.     ActionFlag = (ZLogonMailLevel$ = "S")
  998.     LogonMailNew = (ZLogonMailLevel$ = "N")
  999.     GOSUB 1895
  1000.     IF ZActiveUserName$ = "SYSOP" AND NOT ZSysop THEN _
  1001.        ZActiveUserName$ = ZOrigUserName$
  1002.     LogonMailNew = ZFalse
  1003.     ZSubParm = 2
  1004.     CALL Line25
  1005.     ZSection$ = "    "
  1006.     ZOutTxt$ = ""
  1007.     IF (NOT ZConfMode) AND (NOT ZSubBoard) AND NOT TurboLogon THEN _
  1008.        MailCheckConfirm = ZTrue : _
  1009.        ZNonStop = ZTrue : _
  1010.        GOSUB 5800
  1011.     MailCheckConfirm = ZFalse
  1012.     ZWasQ! = ZMinsInDoors * 60
  1013.     ZMinsInDoors = 0
  1014. 902 IF LogonPswdFailed THEN _
  1015.        ZExitToDoors = ZFalse : _
  1016.        CALL UpdateU (ZTrue) : _
  1017.        ZLogonErrorIndex = 4 : _
  1018.        GOTO 10620
  1019.     IF ZExitToDoors and ZDooredTo$ <> "" THEN _
  1020.        CALL BufFile (ZOutTxt$(7),WasX)
  1021.     ZExitToDoors = ZFalse
  1022.     IF ZHomeConf$ = "" THEN _
  1023.        GOSUB 2350
  1024.     IF NOT ZPrivateDoor THEN _
  1025.        GOTO 955
  1026.     GOSUB 20165
  1027.     CALL SetSection
  1028.     ZPrivateDoor = ZFalse
  1029.     GOTO 1205
  1030. 955 IF NOT TurboLogon THEN _
  1031.        GOSUB 4850
  1032.     TurboLogon = ZFalse
  1033. '
  1034. ' *                           COMMAND PROCESSING
  1035. '
  1036. 1200 CLOSE 1
  1037.      GOSUB 1280
  1038. 1205 IF ZSubParm < 0 THEN _
  1039.         GOTO 202
  1040.      ZSubParm = 1
  1041.      ZStopInterrupts = ZFalse
  1042.      ZWasQ = 0
  1043.      IF ConfMailJoin OR (ZHomeConf$ <> "" AND ZHomeConf$ <> "MAIN") THEN _
  1044.         TurboLogon = (NOT ConfMailJoin) : _
  1045.         ConfMailJoin = ZFalse : _
  1046.         ZFF = 8 : _
  1047.         ZUserIn$(ZAnsIndex) = ZHomeConf$ : _
  1048.         ZLastIndex = -ZLastIndex*(ZLastIndex > ZAnsIndex)-ZAnsIndex*(ZLastIndex <= ZAnsIndex) : _
  1049.         ZAnsIndex = ZAnsIndex - 1 : _
  1050.         ZHomeConf$ = "" : _
  1051.         ZWasQ = ZLastIndex : _
  1052.         ZStoreParseAt = 1 : _
  1053.         ZLastCommand$ = "MJ" : _
  1054.         GOTO 1240
  1055.      CALL SkipLine (1)
  1056. 1210 GOSUB 41000
  1057.      IF ZAnsIndex < ZLastIndex THEN _
  1058.         GOTO 1232
  1059.      CALL Talk (10,ZOutTxt$)
  1060.      CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  1061.      IF ZExpertUser THEN _
  1062.         GOTO 1230
  1063. 1212 ZLinesPrinted = -ZMenusCanPause * ZLinesPrinted
  1064.      IF ZCustomPUI THEN _
  1065.         GOTO 1230
  1066.      IF ZSubSection < ZBegFile THEN _
  1067.         IF ZUserSecLevel >= ZSysopMenuSecLevel THEN _
  1068.            ZFileName$ = ZMenu$(1) : _
  1069.            GOSUB 43025
  1070.      ZFileName$ = ZMenu$(ZMenuIndex)
  1071.      ZDeleteInvalid = ZTrue
  1072.      GOSUB 43025
  1073.      ZDeleteInvalid = ZFalse
  1074. 1230 CALL Line25
  1075.      ZOutTxt$ = ZConfName$ + ":"
  1076.      GOSUB 12978
  1077.      CALL Talk (65,ZConfName$)
  1078.      CALL DispTimeRemain (MinsRemaining)
  1079.      IF ZMenuIndex = 6 THEN _
  1080.         ZSubParm = 1 : _
  1081.         CALL Library
  1082.      CALL Talk (ZMenuIndex, ZOutTxt$)
  1083. 1232 MID$(ZLastCommand$,2,1) = " "
  1084.      IF ZCustomPUI THEN _
  1085.         CALL UserFace (ZUserGraphicDefault$) : _
  1086.         GOSUB 12997 : _
  1087.         GOTO 1235
  1088.      ZOutTxt$ = ZCmdPrompt$
  1089.      GOSUB 12930
  1090.      IF ZWasQ = 0 THEN _
  1091.         GOTO 1230
  1092. 1235 ZWasZ$ = ZUserIn$(ZAnsIndex)
  1093.      IF ZWasZ$ = SPACE$(LEN(ZWasZ$)) THEN _
  1094.         GOTO 1230
  1095.      CALL SearchCmd (ZSubSection,ZFF)
  1096.      IF ZFF > 0 THEN _
  1097.         GOTO 1239
  1098.      IF ZWasQ > 0 THEN _
  1099.         CALL QuickTPut1 ("Unknown command <"+ZWasZ$+">")
  1100.      CALL FlushKeys
  1101.      GOTO 1230
  1102. 1239 CALL Talk (65,"OPTION "+ZWasZ$+" SELECTED")
  1103. 1240 IF ZUserSecLevel < ZOptSec(ZFF) THEN _
  1104.        ZViolation$ = ZSection$ + _
  1105.                      " " + _
  1106.                      ZWasZ$ : _
  1107.         GOSUB 1380 : _
  1108.         GOTO 1205
  1109.      IF ZFF > 39 THEN _
  1110.         ZDirExtension$ = ZLibDirExtension$ _
  1111.      ELSE ZDirExtension$ = ZMainDirExtension$
  1112.         ON ZFF GOSUB _
  1113.                  1400, _      ' 1  A)nswer questionnaire 1
  1114.                  9700, _      ' 2  B)ulletins
  1115.                  1800, _      ' 3  C)omments
  1116.                  10970, _     ' 4  D)oor (exit to)
  1117.                  2000, _      ' 5  E)nter a message
  1118.                  1275, _      ' 6  F)ile system (exit to)
  1119.                  1760, _      ' 7  I)nitial welcome redisplayed
  1120.                  5300, _      ' 8  J)oin a conference
  1121.                  3900, _      ' 9  K)ill a message
  1122.                  4700, _      '10  O)perator page
  1123.                  1900, _      '11  P)ersonal mail (look for)
  1124.                  4330, _      '12  R)ead messages
  1125.                  4340, _      '13  S)can message headers
  1126.                  4320, _      '14  T)opic msg scan
  1127.                  1285, _      '15  U)tilities (exit to)
  1128.                  5800, _      '16  V)iew a conference
  1129.                  9800, _      '17  W)ho's on other nodes displayed
  1130.                  1283, _      '18  @)Library (exit to) 18
  1131.                 20160, _      '19  D)ownload
  1132.                 10570, _      '20  G)oodbye
  1133.                 20155, _      '21  L)ist
  1134.                 20185, _      '22  N)ew
  1135.                 20180, _      '23  P)ersonal files
  1136.                 20175, _      '24  S)can
  1137.                 20170, _      '25  U)pload
  1138.                 20140, _      '26  V)iew ARC Contents
  1139.                  5500, _      '27  B)aud rate change 300==>450 1
  1140.                  9100, _      '28  C)lock (time & time on)
  1141.                  42850, _     '29  E)cho selection
  1142.                  42800, _     '30  F)ile transfer protocol
  1143.                  43000, _     '31  G)raphics
  1144.                  5200, _      '32  L)ines per page
  1145.                  10925, _     '33  M)essage margin
  1146.                  5110, _      '34  P)assword change
  1147.                  5400, _      '35  R)eview preferences
  1148.                  4850, _      '36  S)tatistics displayed
  1149.                  1500, _      '37  T)oggle
  1150.                  10090, _     '38  U)serlog displayed 12
  1151.                  30000, _     '39  A)rchive a Library disk 1
  1152.                  30100, _     '40  C)hange a Library disk
  1153.                  30200, _     '41  D)ownload Library files
  1154.                  10570, _     '42  G)oodbye
  1155.                  20155, _     '43  L)ist a Library directory
  1156.                  20175, _     '44  S)can a Library disk directory
  1157.                  20140, _     '45  V)iew arc contents 7
  1158.                  1325, _      '46  H)elp 1
  1159.                  1330, _      '47  ?)help
  1160.                  1250, _      '48  Q)uit
  1161.                  4240, _      '49  X)expert toggle on/off 4
  1162.                  10070, _     '50  1) List comments file 1
  1163.                  10090, _     '51  2) List callers file
  1164.                  10390, _     '52  3) Recover a message
  1165.                  10530, _     '53  4) Erase comments
  1166.                  11000, _     '54  5) User file maintenance
  1167.                   4130, _     '55  6) Toggle page bell on/off
  1168.                  10930        '56  7) Exit to DOS 2.x or above 7
  1169.      GOTO 1205
  1170. '
  1171. ' ***       NEWS file scan        ***
  1172. '
  1173. 1241 NewsDate# = VAL(MID$(BoardCheckDate$,4,2)) + _
  1174.         (100 * VAL(MID$(BoardCheckDate$,1,2))) + _
  1175.         (10000# * (1900 + VAL(MID$(BoardCheckDate$,7,2))))
  1176.      GOTO 1243
  1177. 1242 NewsDate# = 0
  1178. 1243 ZFileName$ = ZNewsFileName$
  1179.      CALL RBBSFind (ZFileName$,WasZ,WasY,ZMsgPtr,WasD)
  1180.      IF WasZ <> 0 THEN _
  1181.         RETURN
  1182.      FDate# = WasD + (100 * ZMsgPtr) + (10000# * (WasY + 1980))
  1183.      IF NewsDate# > FDate# THEN _
  1184.         RETURN
  1185.      IF TurboLogon THEN _
  1186.         CALL QuickTPut1("NEWS file updated since last call") : _
  1187.         RETURN
  1188.      ZStopInterrupts = ZFalse
  1189.      GOSUB 1790
  1190.      WasZ = 0
  1191.      RETURN
  1192. '
  1193. ' ****           QUIT COMMAND (GLOBAL)              ***
  1194. '
  1195. 1250 IF ZExpertUser THEN _
  1196.         ZOutTxt$ = ZQuitPromptExpert$ _
  1197.      ELSE ZOutTxt$ = ZQuitPromptNovice$
  1198.      ZStackC = ZTrue
  1199.      GOSUB 12930
  1200.      IF ZWasQ = 0 THEN _
  1201.         ZUserIn$(ZAnsIndex) = "M"
  1202.      ZWasZ$ = ZUserIn$(ZAnsIndex)
  1203.      CALL AllCaps (ZWasZ$)
  1204.      IF ZWasZ$ = "C" THEN _
  1205.         ZWasZ$ = "M" : _
  1206.         GOTO 5323
  1207.      IF ZWasZ$ <> SPACE$(LEN(ZWasZ$)) THEN _
  1208.         ON INSTR(ZQuitList$,ZWasZ$) GOTO 1275,1280,1285,10570,1283
  1209.      GOTO 1250
  1210. 1275 ZMenuIndex = 3
  1211.      GOTO 1295
  1212. 1280 ZMenuIndex = 2
  1213.      GOTO 1295
  1214. 1283 ZMenuIndex = 6
  1215.      ZActiveFMSDir$ = ""
  1216.      GOTO 1295
  1217. 1285 ZMenuIndex = 4
  1218. 1295 CALL SetSection
  1219.      RETURN
  1220. 1300 CALL QuickTPut1 ("Message base " + ZConfName$)
  1221.      RETURN
  1222. '
  1223. ' **** COMMON LOCAL DISPLAY PRINT  ***
  1224. '
  1225. 1315 NumReturns = 1
  1226. 1320 CALL LPrnt(WasD$,NumReturns)
  1227.      RETURN
  1228. '
  1229. ' ******            HELP (GLOBAL)           ****
  1230. '
  1231. 1325 CALL ViewHelp (ZSubSection,ZUserGraphicDefault$, _
  1232.                 MID$("MAINFILEUTILMAINLIBR",4 * ZMenuIndex - 7,4))
  1233.      IF ZSubParm = -1 THEN _
  1234.         RETURN 10595
  1235.      RETURN
  1236. 1330 IF ZExpertUser THEN _
  1237.         RETURN 1212
  1238.      GOTO 1325
  1239. '
  1240. ' *****  RECORD SECURITY VIOLATIONS   ****
  1241. '
  1242. 1380 CALL SecViolation
  1243.      IF NOT ZDenyAccess THEN _
  1244.         RETURN
  1245. 1386 CALL DenyAccess
  1246.      GOTO 10620
  1247. 1397 ZOutTxt$ = "Sorry, " + _
  1248.           ZFirstName$ + _
  1249.           ", " + _
  1250.           ZOutTxt$
  1251.      GOTO 12975
  1252. '
  1253. ' ***  A - answer questionnaire
  1254. '
  1255. 1400 WasA1$ = ZAnsMenu$
  1256.      CALL Talk (13,ZOutTxt$)
  1257.      ReturnToPrompt = (ZWasQ > 1)
  1258. 1401 ZStackC = ZTrue
  1259.      CALL SubMenu ("Which questionnaire(s), L)ist" + ZPressEnterExpert$, _
  1260.         WasA1$,ZQuesPath$,".DEF","",ZUserGraphicDefault$,ZTrue,ZFalse,ZTrue,"",WasX,ZTrue)
  1261.      IF ZWasQ = 0 THEN _
  1262.         RETURN
  1263.      IF ZSubParm = -1 THEN _
  1264.         RETURN 10595
  1265.      QuestHold$ = ZWasZ$
  1266.      GOSUB 11520
  1267.      CLOSE 2
  1268.      CALL UpdtCalr (QuestHold$ + " questionnaire " + _
  1269.         MID$("answeredaborted",1 - 8 * ZQuestAborted,8),2)
  1270.      IF ReturnToPrompt THEN _
  1271.         RETURN
  1272.      GOTO 1401
  1273. '
  1274. ' *****    Toggle COMMAND (UTILITIES)     ****
  1275. '
  1276. 1500 IF ZAnsIndex < ZLastIndex THEN _
  1277.         GOTO 1510
  1278.      ZOutTxt$ = "A)utodwnld   B)ullet  C)ase     F)ile   H)ilite"
  1279.      GOSUB 1512
  1280.      ZOutTxt$ = "L)ine feeds  N)ulls   T)urboKey X)pert  !)bell"
  1281.      CALL ColorPrompt (ZOutTxt$)
  1282. 1510 ZStackC = ZTrue
  1283.      GOSUB 12930
  1284.      IF ZWasQ=0 THEN _
  1285.         RETURN
  1286.      ZWasZ$ = ZUserIn$(ZAnsIndex)
  1287.      CALL AllCaps (ZWasZ$)
  1288.      ZFF = INSTR("ABCFHLNTX!",ZWasZ$)
  1289.      IF ZFF < 1 THEN _
  1290.         GOTO 1500
  1291.      CALL Toggle (ZFF)
  1292.      GOSUB 12997
  1293.      GOTO 1500
  1294. 1512 CALL ColorPrompt (ZOutTxt$)
  1295.      CALL QuickTPut1 (ZOutTxt$)
  1296.      RETURN
  1297. '
  1298. ' ****  I - COMMAND FROM MAIN MENU (DISPLAY INITIAL WELCOME)  ***
  1299. '
  1300. 1760 ZFileName$ = ZPreLog$
  1301.      GOSUB 1790
  1302.      ZFileName$ = ZWelcomeFile$
  1303.      GOSUB 1790
  1304.      RETURN
  1305. 1790 CALL Graphic (ZUserGraphicDefault$,ZFileName$)
  1306.      CALL BufFile (ZFileName$,WasX)
  1307.      CALL Carrier
  1308.      IF ZSubParm = -1 THEN _
  1309.         RETURN 10595
  1310.      RETURN
  1311. '
  1312. ' ***  C - COMMAND FROM MAIN MENU (LEAVE COMMENT FOR SYSOP)   **
  1313. '
  1314. 1800 MsgTo$ = "SYSOP"
  1315.      OrigSubject$ = "COMMENT"
  1316.      Subject$ = OrigSubject$
  1317.      GOSUB 1893
  1318.      IF (ActiveMessages >= MaxMsgs OR _
  1319.         ((NOT ZMsgsCanGrow) AND _
  1320.         (ZNextMsgRec + 5 + ZMaxNodes > HighestMsgRecord)) OR _
  1321.         NOT ZCmntsAsMsgs ) THEN _
  1322.         ZOutTxt$ = "Want a Reply?  Use "+MID$(ZAllOpts$,5,1) + _
  1323.                    " instead.  Leave a comment (Y,[N])" : _
  1324.         GOSUB 12999 : _
  1325.         IF NOT ZYes THEN _
  1326.            CALL SkipLine (1) : _
  1327.            RETURN _
  1328.         ELSE ZSysopComment = ZTrue : _
  1329.              GOTO 2007
  1330.      ZSysopComment = ZFalse
  1331.      SysopMsg = ZTrue
  1332.      ZMsgHeader$ = "comment"
  1333.      MsgFrom$ = ZActiveUserName$
  1334.      GOTO 2010
  1335. 1850 WasBX = &H3
  1336.      ZWasEN$ = ZCmntsFile$
  1337.      GOSUB 12992
  1338.      CALL OpenWorkA (ZCmntsFile$)
  1339.      ZOutTxt$ = ZFirstName$ + _
  1340.           ", Thanks for comments!"
  1341.      GOSUB 12976
  1342.      CALL AMorPM
  1343.      CALL PrintWorkA (ZActiveUserName$+" "+ZCurDate$+" "+ZTime$+" Node "+ZNodeID$)
  1344.      FOR WasX = 1 TO ZLinesInMsg
  1345.         CALL PrintWorkA (ZOutTxt$(WasX))
  1346.      NEXT
  1347.      CALL PrintWorkA (ZCarriageReturn$)
  1348.      CLOSE 2
  1349.      IF ZErrCode <> 0 THEN _
  1350.         ZWasEL = 1850 : _
  1351.         GOTO 13000
  1352.      WasBX = &H3
  1353.      ZWasEN$ = ZCmntsFile$
  1354.      GOSUB 12993
  1355.      CALL UpdtCalr ("Left comment",1)
  1356.      REDIM ZOutTxt$(ZMsgDim)
  1357.      RETURN
  1358. '
  1359. ' ****  P - COMMAND FROM MAIN MENU (DISPLAY PERSONAL MAIL)  ****
  1360. '
  1361. 1893 ActionFlag = ZTrue
  1362.      GOTO 1897
  1363. 1895 IF TurboLogon THEN _
  1364.         RETURN
  1365.      ZUserIn$(0) = LEFT$("NEW ",-4*LogonMailNew)
  1366. 1897 IF ZActiveMessageFile$ = ZPrevBase$ THEN _
  1367.         ActionFlag = ZFalse : _
  1368.         RETURN
  1369. 1900 GOSUB 5344
  1370.      IF ZPrivateDoor THEN _
  1371.         ActionFlag = ZTrue
  1372.      ZPrevBase$ = ZActiveMessageFile$
  1373.      ShowActive = ZFalse
  1374.      IF NOT ActionFlag THEN _
  1375.         CALL QuickTPut ("Checking messages in " + ConfFileName$,0) : _
  1376.         ShowActive = ZTrue _
  1377.      ELSE CALL QuickTPut ("Loading messages",0)
  1378.      WasA1$ = ""
  1379.      MsgCt = 0
  1380.      MsgsFromUser = ZFalse
  1381.      ActiveMessages = 0
  1382.      MailReported = ActionFlag
  1383.      FirstOld = ZTrue
  1384.      GOSUB 23000
  1385.      MsgRec = FirstMsgRecord
  1386.      MaxMsgs = VAL(MID$(ZMsgRec$,89,7))
  1387.      IF MaxMsgs > WasMM THEN _
  1388.         MaxMsgs = WasMM
  1389.      REDIM ZMsgPtr(MaxMsgs,2)
  1390.      NumDots = 0
  1391. 1905 GET 1,MsgRec
  1392.      CALL CheckInt (MID$(ZMsgRec$,117,4))
  1393.      IF ZErrCode <> 0 THEN _
  1394.         ZWasEL = 1905 : _
  1395.         GOTO 13000
  1396.      NumRecsInMsg = VAL(MID$(ZMsgRec$,117,4))
  1397.      IF NumRecsInMsg < 1 THEN _
  1398.         NumRecsInMsg = 1
  1399. 1906 IF ActionFlag OR (FirstOld AND NOT MailReported) THEN _
  1400.         CALL MarkTime (NumDots)
  1401.      CALL Carrier
  1402.      IF ZSubParm = -1 THEN _
  1403.         RETURN 10595
  1404. 1910 IF MsgRec >= ZNextMsgRec THEN _
  1405.         LowMsgNumber = ZMsgPtr(1,2) : _
  1406.         GOTO 1950
  1407. 1915 IF MID$(ZMsgRec$,116,1) <> ZActiveMessage$ THEN _
  1408.         GOTO 1946
  1409.      WasX$ = MID$(ZMsgRec$,121,2)
  1410.      IF WasX$ <> "  " THEN _
  1411.         IF CVI(WasX$) > ZUserSecLevel THEN _
  1412.            GOTO 1945
  1413.      IF ActionFlag THEN _
  1414.         GOTO 1935
  1415. '
  1416. ' ** ALLOW USERS WITH NAMES LONGER THAN 22 CHARS TO RECEIVE PRIVATE MAIL *
  1417. '
  1418. 1920 GOSUB 4660
  1419.      IF NOT UserInHeader THEN _
  1420.         GOTO 1945
  1421.      IF MsgToCaller THEN _
  1422.         GOTO 1925
  1423.      GOTO 1940
  1424. 1925 ZWasA = VAL(MID$(ZMsgRec$,2,4))
  1425.      IF LogonMailNew THEN _
  1426.         IF ZWasA <= ZLastMsgRead THEN _
  1427.            GOTO 1935
  1428.      IF NOT ShowActive THEN _
  1429.         GOTO 1930
  1430.      MailReported = ZTrue
  1431.      FirstNew = (ZWasA > ZLastMsgRead)
  1432.      IF FirstNew THEN _
  1433.         MsgCt = 0 : _
  1434.         CALL SkipLine (1) : _
  1435.         CALL QuickTPut1 ("New mail for you (* = Private)") _
  1436.      ELSE IF FirstOld THEN _
  1437.              CALL SkipLine (1) : _
  1438.              CALL QuickTPut1 ("Old mail for you (* = Private)") : _
  1439.              FirstOld = ZFalse
  1440.      ShowActive = NOT FirstNew
  1441. 1930 CALL QuickTPut (LEFT$(ZMsgRec$,5),0)
  1442.      MsgCt = MsgCt + 1
  1443.      IF MsgCt MOD 15 = 0 THEN _
  1444.         CALL SkipLine (1) : _
  1445.         CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  1446. 1935 IF NOT MsgFromCaller THEN _
  1447.         GOTO 1945
  1448. 1940 MsgsFromUser = MsgsFromUser + 1
  1449.      WasA1$ = WasA1$ + LEFT$(ZMsgRec$,5)
  1450. 1945 ActiveMessages = ActiveMessages + 1
  1451.      ZMsgPtr(ActiveMessages,1) = MsgRec
  1452.      ZMsgPtr(ActiveMessages,2) = VAL(MID$(ZMsgRec$,2,4))
  1453. 1946 MsgRec = MsgRec + NumRecsInMsg
  1454.      GOTO 1905
  1455. 1950 IF NOT MailReported THEN _
  1456.         ZOutTxt$ = "Sorry, " + _
  1457.              ZFirstName$ + _
  1458.              ", No " + ZUserIn$(0) + "mail for you" : _
  1459.         GOSUB 12975
  1460.      IF MsgsFromUser = 0 OR NOT ZMsgReminder THEN _
  1461.         GOTO 1961
  1462.      IF ActionFlag THEN _
  1463.         GOTO 1961
  1464.      ZOutTxt$ = "Mail you left"
  1465.      GOSUB 12976
  1466. 1960 WasK = 1
  1467.      FOR MsgCt = 1 TO MsgsFromUser
  1468.         ZOutTxt$ = MID$(WasA1$,WasK,5)
  1469.         WasK = WasK + 5
  1470.         GOSUB 12978
  1471.         IF MsgCt MOD 15 = 0 THEN _
  1472.            CALL SkipLine (1) : _
  1473.            CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  1474.      NEXT
  1475.      WasA1$ = ""
  1476.      CALL SkipLine (1)
  1477.      IF ZUserSecLevel >= ZOptSec(9) THEN _
  1478.         CALL QuickTPut1 ("Please K)ill old/unneeded msgs")
  1479. 1961 ActionFlag = ZFalse
  1480.      CALL SkipLine (1)
  1481.      RETURN
  1482. '
  1483. ' ****  E - COMMAND FROM MAIN MENU (ENTER MESSAGE)  ***
  1484. '
  1485. 2000 QuotedReply = ZFalse
  1486.      MsgFrom$ = ZActiveUserName$
  1487.      SysopMsg = ZFalse
  1488.      GOSUB 1893
  1489. 2001 IF (LowMsgNumber > 0 AND ActiveMessages >= MaxMsgs) _
  1490.         OR HighMsgNumber >= 9999 THEN _
  1491.         IF ZActiveMessageFile$ = ZMainMsgFile$ AND _
  1492.            ActiveMessages = 1 THEN _
  1493.            GOTO 5300 _
  1494.         ELSE ZOutTxt$ = "No more messages allowed!  Try tomorrow" : _
  1495.              GOSUB 12975 : _
  1496.              GOTO 3650
  1497. 2006 IF NOT (ZReply OR MsgFwd) THEN _
  1498.         MsgPswd$ = ""
  1499.      ZSysopComment = ZFalse
  1500.      IF ZReply OR MsgFwd THEN SaveAnsIndex = ZAnsIndex
  1501.      IF MsgFwd OR NOT ZReply THEN _
  1502.         IF ZUserSecLevel >= ZOptSec(5) THEN MsgTo$ = ""
  1503. 2007 IF ZSysopComment THEN _
  1504.         ZWasZ$ = ZCmntsFile$ : _
  1505.         ZMsgHeader$ = "comment" _
  1506.      ELSE ZWasZ$ = ZActiveMessageFile$ : _
  1507.           ZMsgHeader$ = "message"
  1508. 2008 IF ZSysopComment OR ZMsgsCanGrow THEN _
  1509.         ZWasY$ = "on disk" : _
  1510.         CALL FindFree : _
  1511.         GOTO 2009
  1512.      IF ZNextMsgRec + 5 + ZMaxNodes < HighestMsgRecord THEN _
  1513.         GOTO 2010
  1514.      ZWasY$ = "in file"
  1515.      ZFreeSpace$ = "1"
  1516. 2009 IF VAL(ZFreeSpace$) >= 2000 THEN _
  1517.         GOTO 2010
  1518.      ZOutTxt$ = "No room " + ZWasY$ + " for " + ZMsgHeader$
  1519.      GOSUB 12979
  1520.      GOTO 3650
  1521. 2010 IF NOT QuotedReply THEN _
  1522.         ZLinesInMsg = 0 : _
  1523.         ZCommPortStack$ = "" : _
  1524.         WasL = 0 : _
  1525.         WasX = 0 : _
  1526.         REDIM ZOutTxt$(ZMsgDim)
  1527.      IF ZGetExtDesc THEN _
  1528.         GOTO 2100
  1529.      GOSUB 1893
  1530.      RcvrRecNum = 0
  1531. 2020 CALL MessageTo (HighestUserRecord,MsgTo$,MsgFrom$,RcvrRecNum,Found)
  1532.      IF MsgTo$ = "" THEN _
  1533.         RETURN
  1534.      IF ZSysopComment OR SysopMsg THEN _
  1535.         GOTO 2100
  1536.      IF ZReply OR MsgFwd THEN _
  1537.         Found = ZTrue : _
  1538.         CALL Trim (MsgTo$):  _
  1539.         GOTO 2035 _
  1540.      ELSE Subject$ = ""
  1541.      GOSUB 2065
  1542. 2035 IF QuotedReply THEN _
  1543.         RETURN
  1544.      GOTO 2100
  1545. '
  1546. ' *****  SET/CHANGE SUBJECT FOR A MESSAGE   ***
  1547. '
  1548. 2065 IF Subject$ <> "" THEN _
  1549.         ZOutTxt$ = "Change subject from " + _
  1550.              Subject$ + _
  1551.              " to" _
  1552.      ELSE ZOutTxt$ = "Subject"
  1553.      ZMacroMin = 99
  1554.      ZParseOff = ZTrue
  1555.      GOSUB 12932
  1556.      IF LEN(ZUserIn$) > 25 THEN _
  1557.         ZOutTxt$ = "25 Char. Max" : _
  1558.         GOSUB 12979 : _
  1559.         GOTO 2065
  1560.      IF ZWasQ = 0 THEN _
  1561.         IF Subject$ <> "" THEN _
  1562.            RETURN _
  1563.         ELSE GOSUB 2435 : _
  1564.              IF ZYes THEN _
  1565.                 RETURN 5160 _
  1566.              ELSE GOTO 2065
  1567.      Subject$ = ZUserIn$
  1568.      CALL AllCaps (Subject$)
  1569.      OrigSubject$ = Subject$
  1570.      RETURN
  1571. '
  1572. ' *****  ENTER MAIN BODY OF MESSAGE  ****
  1573. '
  1574. 2100 ZOutTxt$ = "Type " + _
  1575.           ZMsgHeader$ + _
  1576.           STR$(ZMaxMsgLines) + _
  1577.           " lines max" + _
  1578.           ZPressEnter$
  1579.      GOSUB 12975
  1580.      GOSUB 3200
  1581. 2125 ZLinesInMsg = ZLinesInMsg + 1
  1582. 2127 IF ZRemoteEcho OR ZLocalUser THEN _
  1583.         ZOutTxt$ = RIGHT$(STR$(ZLinesInMsg),2) + _
  1584.              ": " + _
  1585.              ZOutTxt$(ZLinesInMsg) _
  1586.      ELSE ZOutTxt$ = ZOutTxt$(ZLinesInMsg)
  1587.      GOSUB 12978
  1588.      CALL LineEdit(ZLinesInMsg,ZRightMargin + 1)
  1589.      IF ZWaitExpired THEN _
  1590.         GOTO 2300 _
  1591.      ELSE IF ZSubParm = -1 THEN _
  1592.              GOTO 10595
  1593.      CALL FindFKey
  1594.      IF ZSubParm < 0 THEN _
  1595.         GOTO 202
  1596.      IF ZOutTxt$(ZLinesInMsg) = "" THEN _
  1597.         ZLinesInMsg = ZLinesInMsg - 1 : _
  1598.         GOTO 2300
  1599. 2140 WasJ = ZLinesInMsg
  1600.      GOSUB 2200
  1601.      IF WasX THEN _
  1602.         GOTO 2300
  1603.      GOTO 2125
  1604. 2200 WasX = 0
  1605.      IF WasJ < (ZMaxMsgLines - 2) THEN _
  1606.         RETURN
  1607.      ZOutTxt$ = MID$("2 lines leftLast line   Full",12 * (WasJ-(ZMaxMsgLines - 2)) + 1,12)
  1608.      WasX = (WasJ > (ZMaxMsgLines - 1))
  1609. 2210 GOSUB 12979
  1610.      RETURN
  1611. '
  1612. ' *****  FINAL MESSAGE DISPOSITION   ****
  1613. '
  1614. 2300 CALL SkipLine (1)
  1615.      IF ZExpertUser THEN _
  1616.         GOTO 2315
  1617. 2302 ZOutTxt$ = "A)bort, " + LEFT$("B)atch import, ",-15 * (ZSysop OR ZLocalUser)) + _
  1618.                 "C)ontinue adding, D)elete lines, E)dit a line"
  1619.      GOSUB 1512
  1620.      ZOutTxt$ = "I)nsert lines, L)ist, M)argin change, R)evise subj, S)ave msg, ?)help"
  1621.      GOSUB 1512
  1622. 2315 ZOutTxt$ = "Edit Sub-function <A," + _
  1623.           LEFT$("B,",-2 * (ZSysop OR ZLocalUser)) + _
  1624.           "C,D,E,I,L,M,R,S,?>"
  1625.      GOSUB 12930
  1626.      IF ZWasQ = 0 THEN _
  1627.         GOTO 2315
  1628.      CALL AraAllCaps (ZUserIn$(),ZAnsIndex)
  1629.      ZWasZ$ = ZUserIn$(ZAnsIndex)
  1630. 2330 ON INSTR("ABCDEILMRS?",ZWasZ$) GOTO 2400,2335,2332,2500,2600,2800,3000,3100,2440,3400,2345
  1631.      GOTO 2300
  1632. 2332 IF ZLinesInMsg < 1 THEN _
  1633.         ZLinesInMsg = 1
  1634.      GOTO 2127
  1635. 2335 WasX = ZLinesInMsg
  1636.      CALL MsgImport (ZMaxMsgLines,ZRightMargin,ZLinesInMsg,ZOutTxt$())
  1637.      IF ZLinesInMsg > WasX THEN _
  1638.         GOTO 3000 _
  1639.      ELSE GOTO 2300
  1640. '
  1641. ' *****  DISPLAY MESSAGE SUBCOMMANDS HELP FILE   ****
  1642. '
  1643. 2345 ZFileName$ = ZHelp$(4)
  1644.      GOSUB 1790
  1645.      GOTO 2302
  1646. 2350 IF ZCurPUI$ = "" OR ZSubBoard THEN _
  1647.         ZCurPUI$ = ZMainPUI$
  1648.      CALL FindIt (ZCurPUI$)
  1649.      ZCustomPUI = ZOK
  1650.      IF NOT ZOK THEN _
  1651.         ZCurPUI$ = ""
  1652.      ZPrevPUI$ = ""
  1653.      RETURN
  1654. '
  1655. ' ****  ABORT MESSAGE   ***
  1656. '
  1657. 2400 GOSUB 2435
  1658.      IF NOT ZYes THEN _
  1659.         GOTO 2300
  1660. 2430 ZOutTxt$ = "Aborted"
  1661.      GOSUB 12975
  1662.      GOTO 3650
  1663. 2435 ZOutTxt$ = "Abort " + _
  1664.           ZMsgHeader$ + _
  1665.           " (Y/[N])"
  1666.      GOSUB 12995
  1667.      RETURN
  1668. '
  1669. ' *****  CHANGE SUBJECT OF A MESSAGE  ****
  1670. '
  1671. 2440 GOSUB 2065
  1672.      GOTO 2300
  1673. '
  1674. ' *****  (BLOCK) DELETE MESSAGE LINE(S)  *****
  1675. '
  1676. 2500 ZOutTxt$ = "Delete from"
  1677.      GOSUB 3300
  1678.      Mark1 = ZTestedIntValue
  1679. 2520 ZOutTxt$ = "Up to and including Line # (ENTER =" + STR$(Mark1) + ")"
  1680.      GOSUB 3302
  1681.      IF ZWasQ = 0 THEN _
  1682.         Mark2 = Mark1 _
  1683.      ELSE Mark2 = ZTestedIntValue
  1684.      CALL SkipLine(1)
  1685.      IF Mark1 > Mark2 THEN _
  1686.         ZOutTxt$ = "Beginning exceeds end.  Block NOT deleted" : _
  1687.         GOSUB 12979 : _
  1688.         GOTO 2555
  1689.      IF Mark1 <= MsgLockLines THEN _
  1690.         ZOutTxt$ = "You can NOT delete lines 1 -" + STR$(MsgLockLines) + "!" : _
  1691.         GOSUB 12979 : _
  1692.         GOTO 2555
  1693.      GOTO 2530
  1694. 2522 FOR WasX = Mark1 TO Mark2
  1695.         CALL AskMore ("",ZTrue,ZTrue,WasXX,ZFalse)
  1696.         IF ZNo OR ZRet THEN _
  1697.            WasX = Mark2 + 1 _
  1698.         ELSE ZOutTxt$ = ZOutTxt$(WasX) : _
  1699.            GOSUB 12977
  1700.      NEXT
  1701.      CALL SkipLine(1)
  1702. 2530 ZOutTxt$ = "Delete lines " + STR$(Mark1) + "-" + _
  1703.         MID$(STR$(Mark2),2) + " (Y,[N],L)ist)"
  1704.      GOSUB 12930
  1705.      Temp$ = ZUserIn$(ZAnsIndex)
  1706.      CALL AllCaps(Temp$)
  1707.      IF Temp$ = "L" THEN GOTO 2522
  1708.      IF NOT ZYes THEN _
  1709.         ZOutTxt$ = "NOT Deleted" : _
  1710.         GOSUB 12979 : _
  1711.         GOTO 2555
  1712. 2550 ZBlockSize = (Mark2 - Mark1) + 1
  1713.      EndOfBuffer = ZLinesInMsg + 1
  1714.      ZLinesInMsg = ZLinesInMsg - ZBlockSize
  1715.      FOR WasX = Mark1 TO ZLinesInMsg
  1716.         ZOutTxt$(WasX) = ZOutTxt$(WasX + ZBlockSize)
  1717.      NEXT
  1718.      FOR WasX = (ZLinesInMsg + 1) TO (EndOfBuffer)
  1719.         ZOutTxt$(WasX) = ""
  1720.      NEXT
  1721.      ZOutTxt$ = "Deleted" + STR$(ZBlockSize) + " line(s)"
  1722.      GOSUB 12979
  1723. 2555 Mark1 = 0
  1724.      Mark2 = 0
  1725.      GOTO 2300
  1726. '
  1727. ' ****  EDIT MESSAGE LINE  ***
  1728. '
  1729. 2600 ZOutTxt$ = "Edit"
  1730.      GOSUB 3300
  1731.      IF ZTestedIntValue <= MsgLockLines THEN _
  1732.         ZOutTxt$ = "Not permitted to change 1st" + _
  1733.                     STR$(MsgLockLines) + " line(s)" : _
  1734.         GOSUB 12979 : _
  1735.         GOTO 2300
  1736.      CALL EditALine (ZTestedIntValue)
  1737.      IF ZSubParm < 0 THEN _
  1738.         GOTO 202
  1739.      GOTO 2300
  1740. 2800 IF ZLinesInMsg >= ZMaxMsgLines AND NOT ZSysop THEN _
  1741.         ZOutTxt$ = "Message full" : _
  1742.         GOSUB 12979 : _
  1743.         GOTO 2300
  1744. 2820 ZOutTxt$ = "Insert Before" : _
  1745.      GOSUB 3300
  1746. 2830 WasLL = ZLinesInMsg
  1747.      WasK = ZLinesInMsg - ZTestedIntValue
  1748.      FOR WasX = ZTestedIntValue TO ZLinesInMsg
  1749.         ZUserIn$(WasX + 1 - ZTestedIntValue) = ZOutTxt$(WasX)
  1750.         ZOutTxt$(WasX) = ""
  1751.      NEXT
  1752.      ZLinesInMsg = ZTestedIntValue
  1753. 2840 ZOutTxt$ = RIGHT$(STR$(ZLinesInMsg),2) + _
  1754.           ": " + ZOutTxt$(ZLinesInMsg)
  1755.      GOSUB 12978
  1756.      CALL LineEdit(ZLinesInMsg,ZRightMargin + 1)
  1757.      IF ZOutTxt$(ZLinesInMsg) = "" THEN _
  1758.         GOTO 2920
  1759. 2870 ZLinesInMsg = ZLinesInMsg + 1
  1760.      WasJ = ZLinesInMsg + WasK - 1
  1761.      GOSUB 2200
  1762.      IF NOT WasX THEN _
  1763.         GOTO 2840
  1764. 2920 FOR WasX = 1 TO WasK + 1
  1765.         ZOutTxt$(ZLinesInMsg + WasX - 1) = ZUserIn$(WasX)
  1766.      NEXT
  1767.      REDIM ZUserIn$(ZMsgDim)
  1768.      ZLinesInMsg = WasLL + ZLinesInMsg - ZTestedIntValue
  1769.      GOTO 2300
  1770. '
  1771. ' *****  LIST MESSAGE CONTENTS   ****
  1772. '
  1773. 3000 GOSUB 3010
  1774.      GOTO 2300
  1775. 3010 ZStopInterrupts = ZFalse
  1776.      CALL SkipLine (1)
  1777.      IF (ZWasQ = 1 OR MsgFwd) AND NOT ZGetExtDesc THEN _
  1778.         WasL = 1 : _
  1779.         ZOutTxt$ = ZFG3$ + "To: " + _
  1780.              MsgTo$ + _
  1781.              ZFG4$ + " Re: " + _
  1782.              Subject$ + ZEmphasizeOff$ : _
  1783.         GOSUB 12979 : _
  1784.         CALL QuickTPut (MID$("    ",1,-4 * (NOT ZRemoteEcho)),0) : _
  1785.         GOSUB 3200
  1786. 3020 IF ZGetExtDesc THEN WasL = 1
  1787.      FOR WasX = WasL TO ZLinesInMsg
  1788.         CALL AskMore ("",ZTrue,ZTrue,WasXX,ZFalse)
  1789.         IF ZNo OR ZRet THEN _
  1790.            WasX = ZLinesInMsg + 1 _
  1791.         ELSE ZOutTxt$ = RIGHT$(STR$(WasX),2) + _
  1792.                   ": " + _
  1793.                   ZOutTxt$(WasX) : _
  1794.              GOSUB 12979
  1795.      NEXT
  1796.      RETURN
  1797. '
  1798. ' *****  CHANGE MARGIN WIDTH   ****
  1799. '
  1800. 3100 CALL SkipLine (1)
  1801.      ZOutTxt$ = "SET Right-Margin from" + _
  1802.           STR$(ZRightMargin) + _
  1803.           " TO (8...72)"
  1804.      GOSUB 12932
  1805.      IF LEN(ZUserIn$(ZAnsIndex)) > 2 THEN _
  1806.         GOTO 3140
  1807. 3130 WasX = VAL(ZUserIn$(ZAnsIndex))
  1808.      IF WasX > 7 AND WasX < 73 THEN _
  1809.         ZRightMargin = WasX : _
  1810.         ZOutTxt$ = "Margin now" + _
  1811.              STR$(ZRightMargin) : _
  1812.         GOTO 3150
  1813. 3140 ZOutTxt$ = "Invalid - Margin UNCHANGED"
  1814. 3150 GOSUB 12979
  1815.      IF UtilMarginChange THEN _
  1816.         RETURN
  1817.      GOTO 2300
  1818. 3200 ZOutTxt$ = "[" + _
  1819.           STRING$(ZRightMargin - 2,45) + _
  1820.           "]"
  1821.      IF ZRemoteEcho OR ZLocalUser THEN _
  1822.         ZOutTxt$ = "    " + _
  1823.              ZOutTxt$
  1824.      GOSUB 12975
  1825.      RETURN
  1826. 3300 ZOutTxt$ = ZOutTxt$ + " Line #" + ZPressEnter$
  1827. 3302 CALL SkipLine (-(ZAnsIndex >= ZLastIndex))
  1828.      GOSUB 12932
  1829.      IF ZWasQ = 0 THEN _
  1830.         IF Mark1 = 0 THEN _
  1831.            RETURN 2300 _
  1832.         ELSE RETURN
  1833.      CALL CheckInt (ZUserIn$(ZAnsIndex))
  1834.      IF ZErrCode = 0 THEN _
  1835.         IF ZTestedIntValue >= 1 THEN _
  1836.            IF ZTestedIntValue <= ZLinesInMsg THEN _
  1837.               RETURN
  1838.      ZOutTxt$ = "No such line #" + STR$(ZTestedIntValue)
  1839.      GOSUB 12979
  1840.      RETURN 2300
  1841. '
  1842. ' ****  SAVE MESSAGE   ***
  1843. '
  1844. 3400 IF ZGetExtDesc THEN _
  1845.         ZSysopComment = ZFalse : _
  1846.         RETURN
  1847.      IF ZSysopComment THEN _
  1848.         ZSysopComment = ZFalse : _
  1849.         GOTO 1850
  1850. 3405 SaveReplyStatus = ZReply
  1851.      ZReply = ZTrue
  1852.      IF SysopMsg THEN _
  1853.         MsgPswd$ = "^READ^" _
  1854.      ELSE CALL MsgProt (MsgTo$,Found,MsgPswd$)
  1855.      SysopMsg = ZFalse
  1856.      ZReply = SaveReplyStatus
  1857.      GOSUB 4910
  1858.      MsgRecSave$ = ZMsgRec$
  1859.      MsgCorrected = ZFalse
  1860.      GOSUB 23100
  1861.      ZOutTxt$ = "Adding new msg #" + _
  1862.           STR$(HighMsgNumber + 1)
  1863.      IF NOT ZLocalUser THEN _
  1864.         CALL UpdtCalr (ZOutTxt$,1)
  1865.      GOSUB 12978
  1866.      ZWasSL = 0
  1867.      ZWasN$ = ""
  1868.      ZLastIndex = 0
  1869.      HighMsgNumber = HighMsgNumber + 1
  1870. 3410 ActiveMessages = ActiveMessages + 1
  1871.      MsgNum$ = STR$(HighMsgNumber) + _
  1872.                        SPACE$(5 - LEN(STR$(HighMsgNumber)))
  1873.      IF MsgPswd$ = "^READ^" THEN _
  1874.         MID$(MsgNum$,1,1) = "*" : _
  1875.         SecForMsg = ZPrivateReadSec _
  1876.      ELSE SecForMsg = ZPublicReadSec
  1877. 3460 IF NOT MsgFwd THEN _
  1878.         MsgFrom$ = LEFT$(ZActiveUserName$ + SPACE$(31),31) _
  1879.      ELSE _
  1880.         MsgFrom$ = LEFT$(MsgFrom$ + SPACE$(31),31)
  1881.      MsgTo$ = LEFT$(MsgTo$ + SPACE$(31),31)
  1882.      MID$(MsgTo$,23,8) = TIME$
  1883.      Subject$ = LEFT$(OrigSubject$ + SPACE$(25),25)
  1884.      MsgPswd$ = LEFT$(MsgPswd$ + SPACE$(15),15)
  1885.      IF QuotedReply AND _
  1886.         ZLinesInMsg > ZMaxMsgLines THEN _
  1887.            ZLinesInMsg = ZMaxMsgLines
  1888.      FOR WasJ = 1 TO ZLinesInMsg
  1889.         ZOutTxt$(WasJ) = ZOutTxt$(WasJ) + _
  1890.                 CHR$(227)
  1891.         ZWasSL = ZWasSL + LEN(ZOutTxt$(WasJ))
  1892.      NEXT
  1893.      IF ZWasSL MOD 128 = 0 THEN _
  1894.         ZWasN$ = STR$(ZWasSL \ 128 + 1) _
  1895.      ELSE ZWasN$ = STR$(ZWasSL \ 128 + 2)
  1896. 3530 Temp = ZNextMsgRec
  1897.      ZNextMsgRec = Temp + VAL(ZWasN$)
  1898.      LSET ZMsgRec$ = MsgRecSave$
  1899.      GOSUB 24000
  1900.      GET 1,Temp
  1901.      ZMsgPtr(ActiveMessages,1) = Temp
  1902.      ZMsgPtr(ActiveMessages,2) = HighMsgNumber
  1903.      LSET ZMsgRec$ = MsgNum$ + _
  1904.                      MsgFrom$ + _
  1905.                      MsgTo$ + _
  1906.                      ZCurDate$ + _
  1907.                      Subject$ + _
  1908.                      MsgPswd$ + _
  1909.                      ZActiveMessage$ + _
  1910.                      ZWasN$ + _
  1911.                      SPACE$(4 - LEN(ZWasN$)) + _
  1912.                      MKI$(SecForMsg)
  1913.      PUT 1,Temp
  1914.      ZWasN$ = ""
  1915.      NumDots = 0
  1916.      FOR WasJ = 1 TO ZLinesInMsg
  1917.         CALL MarkTime (NumDots)
  1918.         ZWasN$ = ZWasN$ + _
  1919.              ZOutTxt$(WasJ)
  1920.         IF LEN(ZWasN$) > 127 THEN _
  1921.            LSET ZMsgRec$ = ZWasN$ : _
  1922.            PUT 1 : _
  1923.            ZWasN$ = MID$(ZWasN$,129)
  1924. 3630 NEXT
  1925.      IF LEN(ZWasN$) > 0 THEN _
  1926.         LSET ZMsgRec$ = ZWasN$ : _
  1927.         PUT 1
  1928.      REDIM ZOutTxt$(ZMsgDim)
  1929.      IF MsgCorrected THEN _
  1930.         MsgCorrected = ZFalse : _
  1931.         ActionFlag = ZTrue : _
  1932.         CALL SkipLine (1) : _
  1933.         GOSUB 1900
  1934. 3640 CALL SkipLine (1)
  1935.      GET 1,1
  1936.      GOSUB 12985
  1937. ' ---[ notify receiver that has new mail waiting ]---
  1938.      IF RcvrRecNum > 0 THEN _
  1939.         UserFileIndexSave = ZUserFileIndex : _
  1940.         UserRecordHold$ = ZUserRecord$ : _
  1941.         ZUserFileIndex = RcvrRecNum : _
  1942.         GOSUB 12989 : _
  1943.         GET 5, RcvrRecNum : _
  1944.         WasX = CVI(MID$(ZUserRecord$,57,2)) : _
  1945.         MID$(ZUserRecord$,57,2) = MKI$(WasX OR 512) : _
  1946.         PUT 5, RcvrRecNum : _
  1947.         GOSUB 12991 : _
  1948.         ZUserFileIndex = UserFileIndexSave : _
  1949.         LSET ZUserRecord$ = UserRecordHold$ : _
  1950.         CALL QuickTPut1 ("Receiver will be notified of new mail") : _
  1951.         RcvrRecNum = 0
  1952. 3650 QuotedReply = ZFalse
  1953.      MsgLockLines = 0
  1954.      IF ZReply OR MsgFwd THEN _
  1955.         ZReply = ZFalse : _
  1956.         ZAnsIndex = SaveAnsIndex : _
  1957.         GOTO 5344
  1958.      IF ZGetExtDesc THEN _
  1959.         ZLinesInMsg = 0 : _
  1960.         RETURN
  1961.      RETURN 1200
  1962. '
  1963. ' ****  K - COMMAND FROM MAIN MENU (KILL MESSAGE)  ***
  1964. '
  1965. 3900 ZKillMessage = ZFalse
  1966.      CALL SkipLine (1)
  1967. 3930 ZOutTxt$ = "Msg #(s) to Kill" + ZPressEnterExpert$
  1968.      GOSUB 12932
  1969.      IF ZWasQ = 0 THEN _
  1970.         RETURN
  1971.      GOSUB 1893
  1972. 3935 CALL CheckInt (ZUserIn$(ZAnsIndex))
  1973.      IF ZErrCode <> 0 THEN _
  1974.         GOTO 3930
  1975.      MsgToKill = ZTestedIntValue
  1976. 3950 GOSUB 5344
  1977.      CALL KillMsg (MsgToKill,ActiveMessages)
  1978. 4040 IF ZKillMessage THEN _
  1979.         RETURN
  1980.      GOTO 3930
  1981. '
  1982. ' ****  Sysop Available toggle
  1983. '
  1984. 4130  ZSubParm = -8
  1985.       CALL FindFKey
  1986.       ZSubParm = 0
  1987.       RETURN
  1988. '
  1989. ' ****  X)pert Toggle
  1990. '
  1991. 4240 CALL Toggle(9)
  1992.      RETURN
  1993. '
  1994. ' ****  T)opic - QUICK SCAN MESSAGES  ***
  1995. '
  1996. 4320 QuickScanMsgs = ZTrue
  1997.      ReadMsgs = ZFalse
  1998.      ScanMsgs = ZFalse
  1999.      MsgStart = 76
  2000.      MsgEnd = 100
  2001.      SecIndex= 0
  2002.      GOTO 4350
  2003. '
  2004. ' ****  R - COMMAND FROM MAIN MENU (READ MESSAGES)  ****
  2005. '
  2006. 4330 QuickScanMsgs = ZFalse
  2007.      ReadMsgs = ZTrue
  2008.      HiLiteRec = -1
  2009.      ScanMsgs = ZFalse
  2010.      MsgStart = 6
  2011.      MsgEnd = 100
  2012.      IF ZLocalUserMode OR NOT ZLocalUser THEN _
  2013.         IF ReadMsgIn$ <> ZActiveMessageFile$ THEN _
  2014.            ReadMsgIn$ = ZActiveMessageFile$ : _
  2015.            CALL UpdtCalr ("Read Messages in " + ReadMsgIn$,1)
  2016.      GOSUB 1300
  2017.      GOTO 4350
  2018. '
  2019. ' ****  S - COMMAND FROM MAIN MENU (SCAN MESSAGE HEADERS)  ***
  2020. '
  2021. 4340 IF ZWasQ < 2 THEN _
  2022.         GOSUB 1300
  2023. 4345 QuickScanMsgs = ZFalse
  2024.      ReadMsgs = ZFalse
  2025.      ScanMsgs = ZTrue
  2026.      MsgStart = 6
  2027.      MsgEnd = 100
  2028.      SecIndex = 0
  2029. '
  2030. ' ** MESSAGE READ MAINLINE (QUICK SCAN, READ & SCAN) ALL USE THIS ROUTINE *
  2031. '
  2032. 4350 SearchHeader$ = ""
  2033.      SubInHeader$ = ""
  2034. 4352 SearchString$ = ""
  2035.      DontPrint = ZFalse
  2036.      JustReplied = ZFalse
  2037.      QuotedReply = ZFalse
  2038.      AddressedToUser = ZFalse
  2039.      CanKill = (ZSysop OR ZUserSecLevel >= ZSecKillAny)
  2040.      GOSUB 1893
  2041.      GOSUB 5344
  2042.      ZWasZ$ = ""
  2043.      FOR WasI = 2 TO ZWasQ
  2044.         IF INSTR("Ss*",ZUserIn$(WasI)) > 0 THEN _
  2045.            ZUserIn$(WasI) = MID$(STR$(ZLastMsgRead+1),2) + "+"
  2046.         IF INSTR("Ll",ZUserIn$(WasI)) > 0 THEN _
  2047.            ZUserIn$(WasI) = MID$(STR$(HighMsgNumber),2) + "-"
  2048.      NEXT
  2049. 4360 ZWasLG$(11) = ZWasZ$
  2050.      NumMsgsSelected = ZLastIndex
  2051.      MsgIndex = ZAnsIndex
  2052.      ZLastIndex = 0
  2053.      ToRequested = ZFalse
  2054.      FromRequested = ZFalse
  2055. '     IF ZPageLength < 1 THEN _
  2056. '        ZNonStop = ZTrue
  2057. 4370 MsgIndex = MsgIndex  + 1
  2058. 4371 IF MsgIndex <= NumMsgsSelected THEN _
  2059.         IF LEN(ZUserIn$(MsgIndex)) = 1 AND _
  2060.            INSTR("Cc",ZUserIn$(MsgIndex)) > 0 THEN _
  2061.            GOTO 4370 _
  2062.         ELSE _
  2063.         CALL CheckInt (ZUserIn$(MsgIndex)) : _
  2064.         IF ZErrCode <> 0 THEN _
  2065.            ZWasEL = 4371 : _
  2066.            GOTO 13000 _
  2067.         ELSE CurMsg = ZTestedIntValue : _
  2068.              ZAnsIndex = MsgIndex : _
  2069.              GOTO 4415
  2070. 4380 WasA1$ = "Msg #" + _
  2071.            STR$(LowMsgNumber) + _
  2072.            "-" + _
  2073.            MID$(STR$(ZMsgPtr(ActiveMessages,2)),2) + _
  2074.            " (H)elp,S)ince,L)ast"
  2075.      IF AddressedToUser OR ToRequested OR FromRequested THEN _
  2076.         ZWasY$ = LEFT$("TO",-2*(ToRequested OR AddressedToUser)) + _
  2077.              LEFT$("/",-AddressedToUser) + _
  2078.              LEFT$("FROM",-4*(FromRequested OR AddressedToUser)) : _
  2079.         CALL QuickTPut1 ("Include only msgs "+ZWasY$+" you.  Read what msgs (? for help)") _
  2080.      ELSE WasA1$ = WasA1$ + _
  2081.                ", T)o,F)rom,M)ine"
  2082.      IF SearchString$ = "" THEN _
  2083.         WasA1$ = WasA1$ + _
  2084.              ", text" _
  2085.      ELSE CALL QuickTPut1 ("Include only msgs with text " + SearchString$ + ".  Read what msgs (? for help)") ' DA090101
  2086. 4390 ZOutTxt$ = WasA1$ + ", [Q]uit)"
  2087.      ZMacroMin = 99
  2088.      ZTurboKey = 0
  2089. 4400 GOSUB 12932
  2090.      IF ZWasQ = 0 THEN _
  2091.         RETURN
  2092. 4402 IF LEN(ZUserIn$(ZAnsIndex)) = 1 THEN _
  2093.         WasY = INSTR("QqHh?",ZUserIn$(ZAnsIndex)) : _
  2094.         IF WasY > 2 THEN _
  2095.             ZFileName$ = ZHelpPath$ + "MR" + ZHelpExtension$ : _
  2096.             GOSUB 1790 : _
  2097.             GOTO 4390 _
  2098.         ELSE IF WasY > 0 THEN _
  2099.                 RETURN
  2100.      MsgIndex = 0
  2101.      NumMsgsSelected = ZWasQ
  2102.      GOTO 4370
  2103. 4415 Forward = ZFalse
  2104.      Reverse = ZFalse
  2105.      IF LEN(ZUserIn$(ZAnsIndex)) = 1 THEN _
  2106.         IF INSTR("Ss*",ZUserIn$(ZAnsIndex)) > 0 THEN _
  2107.            CurMsg = ZLastMsgRead + 1 : _
  2108.            Forward = ZTrue : _
  2109.            GOTO 4430 _
  2110.         ELSE IF INSTR("Ll",ZUserIn$(ZAnsIndex)) > 0 THEN _
  2111.                 CurMsg = HighMsgNumber : _
  2112.                 Reverse = ZTrue : _
  2113.                 GOTO 4490
  2114. 4416 IF INSTR("Mm",ZUserIn$(ZAnsIndex)) THEN _
  2115.         AddressedToUser = ZTrue : _
  2116.         GOTO 4370
  2117.      ZWasA = INSTR("FfTt",ZUserIn$(ZAnsIndex))
  2118.      IF ZWasA > 0 THEN _
  2119.         ToRequested = (ZWasA > 2) : _
  2120.         FromRequested = (ZWasA < 3) : _
  2121.         GOTO 4370
  2122.      IF CurMsg = 0 THEN _
  2123.         IF SearchHeader$ <> "" THEN _
  2124.            GOTO 4370 _
  2125.         ELSE SearchString$ = ZUserIn$(ZAnsIndex) : _
  2126.              SearchCt = 0 : _
  2127.              CALL AllCaps (SearchString$) : _
  2128.              CALL Remove (SearchString$,CHR$(34) + CHR$(39)) : _
  2129.              SearchHeader$ = SearchString$ : _
  2130.              SubInHeader$ = SearchHeader$ : _
  2131.              GOTO 4370
  2132.      CALL SkipLine (1)
  2133. 4430 IF RIGHT$(ZUserIn$(ZAnsIndex),1) = "+" THEN _
  2134.         Forward = ZTrue
  2135.      IF RIGHT$(ZUserIn$(ZAnsIndex),1) = "-" THEN _
  2136.         Reverse = ZTrue : _
  2137.         GOTO 4490
  2138. 4450 ZMsgDimIndex = 1
  2139. 4452 IF ZMsgDimIndex > ActiveMessages THEN _
  2140.         GOTO 4515
  2141.      IF ReadMsgs AND _
  2142.         ZMsgPtr(ZMsgDimIndex,2) = CurMsg THEN _
  2143.         GOTO 4520
  2144. 4470 IF ((ReadMsgs AND Forward) OR _
  2145.         QuickScanMsgs OR ScanMsgs) AND _
  2146.         ZMsgPtr(ZMsgDimIndex,2) >= CurMsg THEN _
  2147.         GOTO 4520
  2148. 4480 ZMsgDimIndex = ZMsgDimIndex + 1
  2149.      GOTO 4452
  2150. 4490 ZMsgDimIndex = ActiveMessages
  2151. 4492 IF ZMsgDimIndex < 1 THEN _
  2152.         GOTO 4515
  2153.      IF ZMsgPtr(ZMsgDimIndex,2) <= CurMsg THEN _
  2154.         GOTO 4540
  2155. 4510 ZMsgDimIndex = ZMsgDimIndex - 1
  2156.      GOTO 4492
  2157. 4515 IF Forward THEN _
  2158.         ZOutTxt$ = "No new messages" : _
  2159.         ZLastMsgRead = HighMsgNUmber : _
  2160.         ZMailWaiting = ZFalse _
  2161.      ELSE ZOutTxt$ = "No such msg #" + _
  2162.                STR$(CurMsg)
  2163.      IF SubInHeader$ = "" THEN _
  2164.         GOSUB 12979
  2165.      GOTO 4370
  2166. 4520 EndingMsgIndex = ZMsgDimIndex
  2167.      IF ReadMsgs AND NOT Forward THEN _
  2168.         GOTO 4560
  2169. 4530 StartMsgIndex = ZMsgDimIndex
  2170.      EndingMsgIndex = ActiveMessages
  2171.      WasSO = 1
  2172.      GOTO 4550
  2173. 4540 StartMsgIndex = ZMsgDimIndex
  2174.      EndingMsgIndex = 1
  2175.      WasSO = -1
  2176. 4550 WasXXX = EndingMsgIndex + WasSO
  2177.      ZMsgDimIndex = StartMsgIndex
  2178. 4552 IF ZMsgDimIndex = WasXXX THEN _
  2179.         CALL Carrier : _
  2180.         GOTO 4637
  2181. 4560   CurHeader = ZMsgPtr(ZMsgDimIndex,1)
  2182.        IF CurHeader < 1 THEN _
  2183.           GOTO 4515
  2184.        GET 1,CurHeader
  2185.        ZPswdFailed = ZFalse
  2186.        UserInHeader = ZFalse
  2187.        ZWasZ$ = MID$(ZMsgRec$,101,15)
  2188.        MsgPswd$ = ZWasZ$
  2189.        CALL Trim(MsgPswd$)
  2190. 4561   GOSUB 4660
  2191.        GOSUB 4655
  2192. 4562   IF NOT CanKill THEN _
  2193.           IF INSTR(ZMsgRec$,"^READ^") > 0 AND NOT UserInHeader THEN _
  2194.              ZPswdFailed = ZTrue : _
  2195.              IF Forward OR Reverse THEN _
  2196.                 GOTO 4635
  2197. 4563   CurMsg = VAL(MID$(ZMsgRec$,2,4))
  2198.        IF ToRequested THEN _
  2199.           IF NOT MsgToCaller THEN _
  2200.              GOTO 4629
  2201.        IF FromRequested THEN _
  2202.           IF NOT MsgFromCaller THEN _
  2203.              GOTO 4629
  2204.        IF AddressedToUser AND NOT UserInHeader THEN _
  2205.           GOTO 4629
  2206.        WasX$ = MID$(ZMsgRec$,121,2)
  2207.        IF WasX$ = "  " THEN _
  2208.           MsgSec = ZMinLogonSec _
  2209.        ELSE MsgSec = CVI(WasX$)
  2210.        IF ZUserSecLevel < MsgSec THEN _
  2211.           GOTO 4629
  2212. 4580   IF INSTR(ZMsgRec$,ZWasLG$(11)) = 0 THEN _
  2213.           GOTO 4635
  2214. 4581   IF MID$(ZMsgRec$,116,1) = ZDeletedMsg$ THEN _
  2215.           GOTO 4630
  2216.        JustSearching = ZFalse
  2217.        IF SearchHeader$ <> "" THEN _
  2218.           ZFF = INSTR(ZMsgRec$,SearchHeader$) : _
  2219.           IF ZFF >= MsgStart AND ZFF <= MsgEnd THEN _
  2220.              HiLitePos = ZFF : _
  2221.              SearchCt = 0 : _
  2222.              GOTO 4582 _
  2223.           ELSE IF ReadMsgs AND SearchString$ <> "" THEN _
  2224.                   JustSearching = ZTrue : _
  2225.                   GOTO 4582 _
  2226.                ELSE GOTO 4629
  2227. 4582   WasPG = ZFalse
  2228.        IF MID$(ZWasZ$,1,1) = "!" THEN _
  2229.           IF NOT CanKill THEN _
  2230.              WasPG = ZTrue : _
  2231.              ZPswdSave$ = MID$(ZWasZ$,2) + _
  2232.                               " " : _
  2233.              ZAttemptsAllowed = 0 : _
  2234.              ZSubParm = 1 : _
  2235.              CALL PassWrd
  2236. 4584   IF ZPswdFailed AND _
  2237.           (QuickScanMsgs OR (ScanMsgs AND NOT WasPG)) THEN _
  2238.           GOTO 4635
  2239. 4585   IF ZPswdFailed THEN _
  2240.           IF WasPG THEN _
  2241.              WasSJ$ = "<PASSWORD>" _
  2242.           ELSE WasSJ$ = "<PROTECTED>" _
  2243.        ELSE WasSJ$ = MID$(ZMsgRec$,76,25)
  2244. 4590   IF QuickScanMsgs THEN _
  2245.           ZOutTxt$ = LEFT$(ZMsgRec$,5) + _
  2246.                " " + _
  2247.                LEFT$(WasSJ$,19) + _
  2248.                " " : _
  2249.           CALL CheckColor (ZOutTxt$,SubInHeader$,ZEmphasizeOff$) : _
  2250.           GOSUB 12978 : _
  2251.           SecIndex = SecIndex + 1 : _
  2252.           IF SecIndex = 3 THEN _
  2253.              SecIndex = 0 : _
  2254.              CALL SkipLine (1) : _
  2255.              GOTO 4630  _
  2256.           ELSE GOTO 4630
  2257. 4600   IF ScanMsgs THEN _
  2258.           GOSUB 8020 : _
  2259.           GOTO 4630
  2260.        IF NOT JustSearching THEN _
  2261.           GOSUB 8000 : _
  2262.           IF QuotedReply THEN _
  2263.              QuotedReply = ZFalse : _
  2264.              GOTO 4602
  2265.        IF ZRet THEN _
  2266.           GOTO 4630
  2267.        CanChangeSec = (ZUserSecLevel => ZSecChangeMsg)
  2268.        ShowKill =  - ((ZUserSecLevel >= ZOptSec(9)) AND (UserInHeader OR CanKill))
  2269.        IF ZExpertUser THEN _
  2270.           WasA1$ = ",H,R,T,=,+,-" + _
  2271.                 MID$(",F",1,- (UserInHeader OR CanChangeSec) * 2) + _
  2272.                 MID$(",K",1,ShowKill * 2) + _
  2273.                 MID$(",U",1,- (ZUserSecLevel >= ZOptSec(54)) * 2) + _
  2274.                 MID$(",S",1, - CanChangeSec * 2) : _
  2275.           GOTO 4601
  2276.        GOSUB 4617
  2277. 4601   ZTurboKey = -ZTurboKeyUser
  2278. 4602   IF NOT ZPswdFailed THEN _
  2279.           GOTO 4603
  2280.        IF WasPG AND (NOT ZNonStop) THEN _
  2281.           ZAttemptsAllowed = 2 : _
  2282.           ZSubParm = 2 : _
  2283.           CALL PassWrd
  2284.        IF ZPswdFailed THEN _
  2285.           GOTO 4629
  2286. 4603   GOSUB 9000
  2287.        JustReplied = ZFalse
  2288.        DontPrint = ZFalse
  2289.        IF JustSearching THEN _
  2290.           GOTO 4629
  2291.        IF ZAnsIndex > NumMsgsSelected THEN _
  2292.           GOTO 4650
  2293.        CALL SkipLine (1)
  2294.        GOSUB 41000
  2295.        ZKillMessage = ZFalse
  2296.        ZReply = ZFalse
  2297. 4604   ZTurboKey = -ZTurboKeyUser
  2298.        CALL AskMore (WasA1$,ZTrue,ZFalse,WasXX,ZFalse)
  2299.        IF ZNo THEN _
  2300.           IF WasXX >= 32000 THEN _
  2301.              WasXX = 0 : _
  2302.              ZAnsIndex = ZLastIndex + 1 : _
  2303.              RETURN _
  2304.           ELSE GOTO 4350
  2305.        IF ZNonStop THEN _
  2306.           GOTO 4629
  2307.        CALL AraAllCaps(ZUserIn$(),1)
  2308.        ZReply = (ZReply OR ZUserIn$(1) ="R")
  2309. 4605   ON INSTR(" FUST+-KRH?=",LEFT$(ZUserIn$(1),1)) GOTO _
  2310.           4620,4606,4607,4608,4609,4610,4610,4611,4621,4612,4614,4615
  2311.        GOTO 4620
  2312. 4606   IF NOT (UserInHeader OR CanChangeSec) THEN _   ' Forward
  2313.           GOTO 4620
  2314.        MsgFwd = ZTrue
  2315.        GOTO 4623
  2316. 4607   IF ZUserSecLevel < ZOptSec(54) THEN _    ' User edit
  2317.           GOTO 4620
  2318.        EditFromRead = 1
  2319.        ZReply=ZTrue
  2320.        CALL PutMsgAttr
  2321.        TempHashValue$ = MsgFrom$
  2322.        CALL Trim (TempHashValue$)
  2323.        IF TempHashValue$ = "SYSOP" THEN _
  2324.           TempHashValue$ = ZSysopPswd1$ + " " + ZSysopPswd2$
  2325.        GOTO 11000
  2326. 4608   IF CanChangeSec THEN _            ' Security to read
  2327.           CALL PutMsgAttr : _
  2328.           GOSUB 4665 : _
  2329.           ZReply = ZFalse : _
  2330.           QuotedReply = ZTrue : _
  2331.           CALL GetMsgAttr : _
  2332.           DontPrint = ZTrue : _
  2333.           ZUserIn$ = "=" : _
  2334.           JustReplied = ZTrue : _
  2335.           GOTO 4560
  2336.        GOTO 4620
  2337. 4609   CALL SetThread (CurMsg, OrigSubject$)     ' Thread
  2338.        IF ZWasQ > 0 THEN _
  2339.           SearchHeader$ = ZUserIn$(2) : _
  2340.           SubInHeader$ = SearchHeader$ : _
  2341.           CALL Trim (SubInHeader$) : _
  2342.           GOTO 4352
  2343.        GOTO 4620
  2344. 4610   ZWasA = INSTR(" +-",ZUserIn$(1))      ' +/- read direction
  2345.        CurMsg = CurMsg + 5 - 2 * ZWasA
  2346.        Forward = (ZWasA = 2)
  2347.        Reverse = (NOT Forward)
  2348.        SearchString$ = ""
  2349.        IF Reverse THEN _
  2350.           GOTO 4490 _
  2351.        ELSE GOTO 4450
  2352. 4611   IF (UserInHeader OR CanKill) THEN _     ' Kill
  2353.          IF ZUserSecLevel >= ZOptSec(9) THEN _
  2354.             CALL PutMsgAttr : _
  2355.             MsgToKill = CurMsg : _
  2356.             Temp = ZWasQ : _
  2357.             GOSUB 3950 : _
  2358.             CALL GetMsgAttr : _
  2359.             GOTO 4629 _
  2360.          ELSE ZViolation$ = "MORE KILL" : _
  2361.               GOSUB 1380 : _
  2362.               GOTO 4629
  2363.        GOTO 4620
  2364. 4612   ZFileName$ = ZHelp$(7)  ' H - help
  2365.        GOSUB 1790
  2366. 4614   GOSUB 4617
  2367.        GOTO 4604
  2368. 4615   CALL SkipLine (1) ' = read again
  2369.        GOTO 4560
  2370. 4617   WasA1$ = ",H)lp,R)eply,T)hread,=,+,-" + _
  2371.                 MID$(",F)wd",1, - (UserInHeader OR CanChangeSec) * 5) + _
  2372.                 MID$(",K)ill",1, ShowKill * 6) + _
  2373.                 MID$(",U)sr",1,- (ZUserSecLevel >= ZOptSec(54)) * 6) + _
  2374.                 MID$(",S)ec",1, - CanChangeSec * 5)
  2375.        RETURN
  2376. 4620   IF NOT ZReply THEN _
  2377.           GOTO 4629
  2378. 4621   IF ZUserSecLevel < ZOptSec(5) THEN _     ' Reply
  2379.           ZViolation$ = "MORE RE" : _
  2380.           GOSUB 1380 : _
  2381.           ZReply = ZFalse : _
  2382.           GOTO 4629
  2383.        IF LEFT$(OrigSubject$,3) <> "(R)" THEN _
  2384.           OrigSubject$ = "(R)" + _
  2385.                      LEFT$(OrigSubject$,22)
  2386. 4622   MsgTo$ = MsgFrom$
  2387.        CALL Trim (MsgTo$)
  2388.        MsgFrom$ = ZActiveUserName$
  2389. 4623   DontPrint = ZFalse
  2390.        CALL PutMsgAttr
  2391.        IF MsgFwd THEN GOTO 4624
  2392.        IF ZNoQuoting THEN GOTO 4627
  2393.        ZOutTxt$ = "Quote " + MsgTo$ + "'s message (Y/[N])"
  2394.        GOSUB 12999
  2395.        IF ZRet OR NOT ZYes THEN _
  2396.           GOTO 4627
  2397. 4624   QuotedReply = ZTrue
  2398.        ZLinesInMsg = ZLinesInMsg - 1
  2399.        IF HiLitedLine > 0 THEN _
  2400.           ZOutTxt$(HiLitedLine) = ZOutTxt$(0) : _
  2401.           HiLitedLine = 0
  2402.        IF MsgFwd THEN _
  2403.           TempRightMargin = ZRightMargin _
  2404.        ELSE _
  2405.           TempRightMargin = ZRightMargin - 2
  2406.        CALL WordWrap (TempRightMargin,ZLinesInMsg,ZOutTxt$())
  2407.        IF ZLinesInMsg > ZMsgDim THEN _
  2408.           ZLinesInMsg = ZMsgDim : _
  2409.           CALL QuickTPut1 ("Original msg truncated to " + _
  2410.                       STR$(ZMsgDim) + " lines for editing!")
  2411.        IF MsgFwd THEN GOTO 4625
  2412.        FOR WasX = 1 TO ZLinesInMsg
  2413.           IF LEFT$(ZOutTxt$(WasX),1) = ">" THEN _
  2414.              ZOutTxt$(WasX) = ">" + ZOutTxt$(WasX) _
  2415.           ELSE ZOutTxt$(WasX) = "> " + ZOutTxt$(WasX)
  2416.        NEXT
  2417. 4625   WasX$ = MsgTo$
  2418.        GOSUB 2001
  2419.        IF (ActiveMessages >= MaxMsgs) OR MsgTo$ = "" THEN _
  2420.           GOTO 4628
  2421.        IF MsgFwd THEN _
  2422.           MsgFwd$ = ZActiveUserName$ : _
  2423.           CALL Trim (MsgFwd$) : _
  2424.           CALL Trim (WasX$) : _
  2425.           MsgFwd$ = "Msg was to " + WasX$ + _
  2426.              ", forwarded by " + MsgFwd$
  2427.        IF (MsgFwd AND CanChangeSec AND NOT MsgFromCaller) THEN _
  2428.           CALL Trim (MsgFrom$) : _
  2429.           ZOutTxt$ = "Message was from " + _
  2430.              MsgFrom$ + _
  2431.              ", change to " + _
  2432.              ZActiveUserName$ + _
  2433.              " (Y/[N])" : _
  2434.           GOSUB 12999 : _
  2435.           IF ZYes THEN _
  2436.              MsgFrom$ = ZActiveUserName$ : _
  2437.              CALL Trim (MsgFrom$) : _
  2438.              GOTO 4626
  2439.        IF MsgFwd AND NOT MsgFromCaller THEN _
  2440.           FOR MsgFwdCount = ZLinesInMsg TO 1 STEP -1 : _
  2441.              ZOutTxt$(MsgFwdCount + 2) = ZOutTxt$(MsgFwdCount) : _
  2442.           NEXT MsgFwdCount : _
  2443.           ZOutTxt$(1) = MsgFwd$ : _
  2444.           ZOutTxt$(2) = "" : _
  2445.           ZLinesInMsg = ZLinesInMsg + 2 : _
  2446.           IF NOT CanChangeSec THEN _
  2447.              MsgLockLines = 1
  2448. 4626   ZWasZ$ = "L"
  2449.        WasL = 1
  2450.        IF ZLinesInMsg >= ZMaxMsgLines THEN _
  2451.           CALL QuickTPut ("Msg cannot exceed" + _
  2452.                       STR$(ZMaxMsgLines) + " lines! ",0)
  2453.        IF NOT MsgFwd THEN _
  2454.           CALL QuickTPut1 ("C continues reply.  Please 1st delete unneeded lines (eg. d 1 5)")
  2455.        GOSUB 3200
  2456.        GOSUB 3020
  2457.        GOSUB 2300
  2458.        GOTO 4628
  2459. 4627   GOSUB 2000
  2460. 4628   ZReply = ZFalse
  2461.        JustReplied = ZTrue
  2462.        QuotedReply = ZTrue
  2463.        CALL GetMsgAttr
  2464.        DontPrint = ZTrue
  2465.        ZUserIn$ = "="
  2466.        QuotedReply = ZTrue
  2467.        MsgFwd = ZFalse
  2468.        GOTO 4560
  2469. 4629   QuotedReply = ZFalse
  2470.        JustReplied = ZFalse
  2471.        IF NOT Forward AND NOT Reverse THEN _
  2472.           GOTO 4370
  2473. 4630   CALL AskMore (",#(s) to read",ZTrue,ZTrue,WasXX,ZFalse)
  2474.        IF ZWasQ = 0 OR ZYes THEN _
  2475.           GOTO 4631
  2476.        IF ZNo THEN _
  2477.           RETURN
  2478.        IF ZSubParm = -1 THEN _
  2479.           RETURN 10595
  2480.        IF ZRet THEN _
  2481.           RETURN
  2482.        ZWasZ$ = ZUserIn$(1)
  2483.        CALL AllCaps (ZWasZ$)
  2484.        IF VAL(ZWasZ$) > 0 THEN _
  2485.           FOR WasI = ZWasQ TO 1 STEP -1 : _
  2486.              ZUserIn$(WasI + 1) = ZUserIn$(WasI) : _
  2487.           NEXT : _
  2488.           ZUserIn$(1) = MID$(ZAllOpts$,INSTR(ZOrigCommands$,"R"),1) : _
  2489.           ZLastIndex = ZWasQ + 1 : _
  2490.           ZAnsIndex = 1 : _
  2491.           RETURN 1235
  2492. 4631   CALL CheckCarrier
  2493.        IF ZSubParm THEN _
  2494.           RETURN 10595
  2495.        IF ZRet THEN _
  2496.           RETURN
  2497. 4635 IF WasSO = 0 THEN _      ' end msg read loop top is 4552
  2498.         WasSO = 1
  2499.      IF SearchString$ <> "" THEN _
  2500.         SearchCt = SearchCt + 1 : _
  2501.         IF SearchCt > 99 THEN _
  2502.            SearchCt = 0 : _
  2503.            ZOutTxt$ = "Searched for " + SearchString$ + " thru msg" + _
  2504.                       STR$(CurMsg) + "  Continue ([Y],N)" : _
  2505.            GOSUB 12932 : _
  2506.            IF ZNo THEN _
  2507.               RETURN
  2508.      ZMsgDimIndex = ZMsgDimIndex + WasSO
  2509.      GOTO 4552
  2510. 4637 IF ReadMsgs THEN _
  2511.         SearchString$ = "" : _
  2512.         SearchHeader$ = "" : _
  2513.         SubInHeader$ = "" : _
  2514.         ToRequested = ZFalse : _
  2515.         FromRequested = ZFalse : _
  2516.         AddressedToUser = ZFalse : _
  2517.         GOTO 4370
  2518. 4650 CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  2519.      CALL SkipLine (1)
  2520.      CALL QuickTPut1 ("--End Msgs--")
  2521.      RETURN
  2522. 4655 '****     update last message read     ****
  2523.      IF SearchHeader$ <> "" OR SearchString$ <> "" OR NOT ReadMsgs THEN _
  2524.         RETURN
  2525. 4656 IF ZMsgPtr(ZMsgDimIndex,2) > ZLastMsgRead THEN _
  2526.         ZMailWaiting = ZFalse : _
  2527.         ZLastMsgRead = ZMsgPtr(ZMsgDimIndex,2)
  2528.      RETURN
  2529. 4660 CALL ChkMsgName (MsgFromCaller,MsgToCaller)
  2530.      UserInHeader = (MsgFromCaller OR MsgToCaller)
  2531.      RETURN
  2532. '
  2533. ' ****  S - CHANGE MESSAGE SECURITY   ***
  2534. '
  2535. 4665 CALL Trim (MsgFrom$)
  2536.      ZOutTxt$ = "Change sender's name from " + _
  2537.         MsgFrom$ + _
  2538.         " to"
  2539.      GOSUB 12995
  2540.      IF ZWasQ = 0 THEN _
  2541.         GOTO 4666
  2542.      IF LEN(ZUserIn$) > 30 THEN _
  2543.         CALL QuickTPut1 ("30 Char. Max") : _
  2544.         GOTO 4665
  2545.      CALL AllCaps (ZUserIn$)
  2546.      MsgFrom$ = ZUserIn$
  2547. 4666 CALL Trim (MsgTo$)
  2548.      ZOutTxt$ = "Change receiver's name from " + _
  2549.         MsgTo$ + _
  2550.         " to"
  2551.      GOSUB 12995
  2552.      IF ZWasQ = 0 THEN _
  2553.         GOTO 4667
  2554.      IF LEN(ZUserIn$) > 30 THEN _
  2555.         CALL QuickTPut1 ("30 Char. Max") : _
  2556.         GOTO 4666
  2557.      CALL AllCaps (ZUserIn$)
  2558.      MsgTo$ = ZUserIn$
  2559.      TempMsgTo$ = ZUserIn$
  2560.      CALL MessageTo (HighestUserRecord,MsgTo$,MsgFrom$,RcvrRecNum,Found)
  2561.      IF MsgTo$ = "" THEN MsgTo$ = TempMsgTo$
  2562. 4667 CALL Trim (Subject$)
  2563.      ZOutTxt$ = "Change subject from " + _
  2564.         Subject$ + _
  2565.         " to"
  2566.      GOSUB 12995
  2567.      IF ZWasQ = 0 THEN _
  2568.         GOTO 4668
  2569.      IF LEN(ZUserIn$) > 25 THEN _
  2570.         CALL QuickTPut1 ("25 Char. Max") : _
  2571.         GOTO 4667
  2572.      CALL AllCaps (ZUserIn$)
  2573.      Subject$ = ZUserIn$
  2574. 4668 ZOutTxt$ = "Change min sec to read from" + _
  2575.         STR$(MsgSec) + _
  2576.         " to"
  2577.      GOSUB 12995
  2578.      IF ZWasQ=0 THEN _
  2579.         GOTO 4669
  2580.      CALL CheckInt (ZUserIn$)
  2581.      IF ZErrCode <> 0 THEN _
  2582.         RETURN
  2583.      MsgSec = ZTestedIntValue
  2584. 4669 ZReply = ZTrue
  2585.      CALL MsgProt (MsgTo$,Found,MsgPswd$)
  2586.      ZReply = ZFalse
  2587. 4670 MsgTo$ = LEFT$(MsgTo$ + SPACE$(22),22)
  2588.      MsgFrom$ = LEFT$(MsgFrom$ + SPACE$(31),31)
  2589.      Subject$ = LEFT$(Subject$ + SPACE$(25),25)
  2590.      MsgPswd$ = LEFT$(MsgPswd$ + SPACE$(15),15)
  2591.      ZSubParm = 3
  2592.      CALL FileLock
  2593.      GET 1,CurHeader
  2594.      MID$(ZMsgRec$,37,22) = MsgTo$
  2595.      MID$(ZMsgRec$,6,31) = MsgFrom$
  2596.      MID$(ZMsgRec$,76,25) = Subject$
  2597.      MID$(ZMsgRec$,121,2) = MKI$(MsgSec)
  2598.      MID$(ZMsgRec$,101,15) = MsgPswd$
  2599.      IF LEFT$(MsgPswd$,6) = "^READ^" THEN _
  2600.         MID$(ZMsgRec$,1,1) = "*" _
  2601.      ELSE _
  2602.         MID$(ZMsgRec$,1,1) = " "
  2603.      PUT 1,CurHeader
  2604.      ZSubParm = 4
  2605.      CALL FileLock
  2606.      CALL QuickTPut1 ("Message header changed")
  2607.      CALL SkipLine (1)
  2608.      CALL FlushKeys
  2609.      RETURN
  2610. '
  2611. ' ****  O - COMMAND FROM MAIN MENU (OPERATOR PAGE)   ***
  2612. '
  2613. 4700 IF NOT ZSysopAvail THEN _
  2614.         ZOutTxt$ = "Sorry, " + _
  2615.              ZSysopFirstName$ + _
  2616.              " not available to answer page" : _
  2617.         GOSUB 12979 : _
  2618.         GOTO 4755
  2619. 4705 CALL QuickTPut1 ("Chat. Remote Conversation")
  2620.      WasJJ = VAL(MID$(TIME$,1,2))*100 + VAL(MID$(TIME$,4,2))
  2621.      IF (WasJJ > ZStartOfficeHours AND WasJJ < ZEndOfficeHours) OR ZSysopAnnoy THEN _
  2622.         GOTO 4710
  2623. 4708 ZOutTxt$ = "SYSOP in from" + _
  2624.           STR$(ZStartOfficeHours) + _
  2625.           " to" + _
  2626.           STR$(ZEndOfficeHours) + ","
  2627.      GOSUB 12979
  2628.      GOTO 4755
  2629. 4710 ZOutTxt$ = "Page " + _
  2630.           ZSysopFirstName$ + _
  2631.           " (Y/[N])"
  2632.      CALL SkipLine (1)
  2633.      GOSUB 12999
  2634.      IF NOT ZYes THEN _
  2635.         RETURN
  2636.      PageCount = 0
  2637.      ZOutTxt$ = "Paging " + _
  2638.           ZSysopFirstName$
  2639.      GOSUB 12978
  2640.      PageTimeStart! = TIMER
  2641.      TempSnoop = ZSnoop
  2642.      ZSnoop = ZTrue
  2643.      CALL Line25
  2644. 4730 CALL DelayTime (1)
  2645. 4735 PageCount = PageCount + 1
  2646.      IF INKEY$ = ZEscape$ THEN _
  2647.         GOTO 4765
  2648. 4740 IF PageCount MOD 2 THEN _
  2649.         ZOutTxt$ = ZPagingPtrSupport$ + _
  2650.              ZBellRinger$ : _
  2651.         IF LEN(ZPagingPtrSupport$) = 3 THEN _
  2652.            CALL Printit (CHR$(7)) : _
  2653.            IF ZErrCode <> 0 THEN _
  2654.               ZWasEL = 4740 : _
  2655.               GOTO 13000
  2656. 4745 GOSUB 12978
  2657.      CALL CheckTime (PageTimeStart!, PageTimeNow!, 2)
  2658.      IF PageTimeNow! < 30 THEN GOTO 4730
  2659.      ZSnoop = TempSnoop
  2660. 4747 GOSUB 12979
  2661. 4750 CALL QuickTPut1 (ZSysopFirstName$ + " not responding")
  2662. 4755 CALL QuickTPut1 ("Try a msg or comment")
  2663.      ZPageStatus$ = "PG!"
  2664.      CALL UpdtCalr ("Operator paged " + LEFT$(TIME$,5),2)
  2665.      RETURN
  2666. 4765 CALL UpdtCalr ("Paged & chatted with Sysop",1)
  2667.      CALL QuickTPut1 ("SYSOP in!  " + _
  2668.           ZFirstName$ + _
  2669.           ", this is " + _
  2670.           ZSysopFirstName$ + _
  2671.           " go ahead!")
  2672.      ZPageStatus$ = ""
  2673. 4770 CALL SysopChat
  2674.      IF ZSubParm < 0 THEN _
  2675.         GOTO 202
  2676.      RETURN
  2677. '
  2678. ' ****  S - COMMAND FROM UTILITY MENU (STATISTICS)  ***
  2679. '
  2680. 4850 GOSUB 1893
  2681.      CALL QuickTPut1 ("RBBS-PC " + ZVersionID$ + " Node " + ZNodeID$)
  2682.      ZOutTxt$ = ""
  2683.      IF NOT ZConfMode THEN _
  2684.         ZOutTxt$ = "Caller # " + _
  2685.              STR$(CallsToDate!) + _
  2686.              "  "
  2687. 4855 ZOutTxt$ = ZOutTxt$ + _
  2688.           "# active msgs:" + _
  2689.           STR$(ActiveMessages)
  2690.      ZOutTxt$ = ZOutTxt$ + _
  2691.           "  Next msg #" + _
  2692.           STR$(HighMsgNumber + 1)
  2693.      IF ZLastMsgRead > 0 THEN _
  2694.         ZOutTxt$ = ZOutTxt$ + _
  2695.              "  Last msg read:" + _
  2696.              STR$(ZLastMsgRead)
  2697. 4857 GOSUB 12976
  2698.      IF (NOT ZSysop) AND (ZUserSecLevel < ZSecKillAny) THEN _
  2699.         RETURN
  2700.      UserWork = (HighestUserRecord * .95) + 1
  2701.      IF ZMsgsCanGrow THEN _
  2702.         ZWasY$ = " open" _
  2703.      ELSE ZWasY$ = STR$(HighestMsgRecord + 1 - NodesInSystem - ZNextMsgRec)
  2704.      ZOutTxt$ = "USERS: used" + _
  2705.           STR$(CurUserCount - 1) + _
  2706.           " avl" + _
  2707.           STR$(UserWork - CurUserCount) + _
  2708.           "  MSGS: used" + _
  2709.           STR$(ActiveMessages) + _
  2710.           " avl" + _
  2711.           STR$(MaxMsgs - ActiveMessages) + _
  2712.           "  MSG REC: used" + _
  2713.           STR$(ZNextMsgRec - 1) + _
  2714.           " avl" + ZWasY$
  2715.      GOSUB 12976
  2716.      ZWasZ$ = ZUpldDriveFile$
  2717.      CALL FindFree
  2718.      CALL QuickTPut1 ("Upload disk has" + ZFreeSpace$)
  2719.      RETURN
  2720. 4900 CALL UpdtCalr ("Entered " + ZConfName$,3)
  2721.      CALL QuickTPut1 ("Welcome to " + ZConfName$)
  2722. 4905 GOSUB 1790
  2723. 4910 GOSUB 12986
  2724.      GOSUB 5344
  2725.      IF LOF(1) = 0 THEN _
  2726.         ZWasDF$ = ZActiveMessageFile$ : _
  2727.         CLOSE 1 : _
  2728.         KILL ZActiveMessageFile$ : _
  2729.         GOSUB 12987 : _
  2730.         RETURN 13600
  2731.      GOSUB 23000
  2732.      RETURN
  2733. '
  2734. ' ****  P - COMMAND FROM UTILITY MENU (PASSWORD CHANGE)  ***
  2735. '
  2736. 5110 CALL NewPassword ("Enter new password" + ZPressEnter$,ZTrue)
  2737.      IF ZSubParm < 0 THEN _
  2738.         GOTO 202
  2739.      IF ZWasQ = 0 THEN _
  2740.         RETURN
  2741. 5120 ZOutTxt$ = "Reenter new password"
  2742.      GOSUB 45010
  2743.      IF ZWasQ = 0 THEN _
  2744.         RETURN
  2745.      CALL AllCaps (ZUserIn$)
  2746.      IF ZWasZ$ <> ZUserIn$ THEN _
  2747.         ZOutTxt$ = "Passwords don't match!" : _
  2748.         GOSUB 12979 : _
  2749.         RETURN
  2750. 5125 IF ZMaxPswdChanges AND _
  2751.         ChangeThisSession > _
  2752.         ZMaxPswdChanges AND _
  2753.         NOT ZSysop THEN _
  2754.             ZOutTxt$ = "No changes permitted" : _
  2755.             GOSUB 12975 : _
  2756.             RETURN _
  2757.      ELSE PswdChangeAllowed = ZTrue : _
  2758.           GOSUB 5140 : _
  2759.           IF NOT Found THEN _
  2760.              GOTO 5129 _
  2761.           ELSE ZOutTxt$ = "Temporary change" : _
  2762.                GOSUB 12975 : _
  2763.                ZPswd$ = ZTempPassword$ : _
  2764.                ZSecsPerSession! = ZTempTimeAllowed * 60 : _
  2765.                ZUserSecLevel = ZTempSecLevel : _
  2766.                GOSUB 41070 : _
  2767.                ZSysop = (ZUserSecLevel >= ZSysopSecLevel) : _
  2768.                CALL SetPrompt : _
  2769.                CALL XferType (2,ZTrue)
  2770.      IF ZActiveUserName$ = "SYSOP" THEN _
  2771.         ZUserIn$(1) = "********"
  2772. 5126 CALL UpdtCalr ("Used temp password " + ZUserIn$,2)
  2773.      RETURN
  2774. 5129 IF ZOrigUserFile$ <> ZActiveUserFile$ THEN _
  2775.         CALL QuickTPut1 ("Password Change only in Logon User File") : _
  2776.         RETURN
  2777.      GOSUB 12989
  2778.      CALL OpenUser (HighestUserRecord)
  2779.      GOSUB 9450
  2780. 5130 IF ZUserFileIndex < 1 OR _
  2781.         ZUserFileIndex > 32767 THEN _
  2782.         GOTO 5160
  2783.      GET 5,ZUserFileIndex
  2784.      CALL AllCaps (ZUserIn$)
  2785.      LSET ZPswd$ = ZUserIn$
  2786.      GOSUB 9440
  2787.      GOSUB 12991
  2788.      ZOutTxt$ = "Password changed"
  2789.      ZStopInterrupts = ZTrue
  2790.      GOSUB 12975
  2791.      IF ZMaxPswdChanges THEN _
  2792.         ChangeThisSession = ChangeThisSession + 1
  2793. 5131 CALL UpdtCalr ("New Password " + ZUserIn$(1),2)
  2794.      RETURN
  2795. '
  2796. ' ****  SEARCH "PASSWORDS" FILE FOR TEMPORARY PASSWORDS  ***
  2797. '
  2798. 5135 ZWasZ$ = ""
  2799.      WasZ = 0
  2800.      GOSUB 5140
  2801.      IF NOT Found THEN _
  2802.         ZTempTimeAllowed = MinsPerSessionDef : _
  2803.         ZTempMaxPerDay = MaxPerDayDef _
  2804.      ELSE ZTimeLockSet = ZTempTimeLock : _
  2805.           ZDaysInRegPeriod = ZTempRegPeriod
  2806.      ZMinsPerSession = ZTempTimeAllowed
  2807.      ZMaxPerDay = -(ZMaxPerDay * (ZTempMaxPerDay <= 0)) - _
  2808.                     (ZTempMaxPerDay * (ZTempMaxPerDay > 0))
  2809.      IF ZLimitMinsPerSession THEN _
  2810.         IF ZMinsPerSession > ZLimitMinsPerSession THEN _
  2811.            ZMinsPerSession = ZLimitMinsPerSession : _
  2812.            ZOutTxt$ = "Time shortened for external event" : _
  2813.            CALL RingCaller
  2814.      GOSUB 825
  2815.      RETURN
  2816. 5140 Found = ZFalse
  2817.      CALL OpenWork (2,ZPswdFile$)
  2818.      IF ZErrCode = 53 THEN _
  2819.         CALL UpdtCalr ("Missing file " + ZPswdFile$,2) : _
  2820.         IF WasZ = 1 THEN _
  2821.            CALL AllCaps (ZUserIn$(1)) : _
  2822.            ZWasZ$ = ZUserIn$(1) : _
  2823.            GOTO 5160 _
  2824.         ELSE GOTO 5160
  2825.      ZWasZ$ = ZWasZ$ + _
  2826.           SPACE$(15 - LEN(ZWasZ$))
  2827. 5150 IF EOF(2) THEN _
  2828.         GOTO 5160
  2829. 5151 CALL GetPassword
  2830.      IF ZErrCode <> 0 THEN _
  2831.         ZWasEL = 5151 : _
  2832.         GOTO 13000
  2833.      IF LEN(ZTempPassword$) > 15 THEN _
  2834.         GOTO 5150
  2835.      ZTempPassword$ = ZTempPassword$ + _
  2836.                       SPACE$(15 - LEN(ZTempPassword$))
  2837.      IF ZWasZ$ <> ZTempPassword$ THEN _
  2838.         GOTO 5150
  2839.      IF PswdChangeAllowed AND _
  2840.         ZUserSecLevel >= ZMinSecForTempPswd THEN _
  2841.         GOTO 5155
  2842.      IF ZUserSecLevel <> ZTempSecLevel THEN _
  2843.         GOTO 5150
  2844.      IF ZStartTime = 0 THEN _
  2845.         GOTO 5155
  2846.      WorkTime$ = TIME$
  2847.      TestTime = VAL(LEFT$(WorkTime$,2) + MID$(WorkTime$,4,2))
  2848.      IF TestTime => ZStartTime AND TestTime <= ZEndTime THEN _
  2849.         GOTO 5155
  2850.      IF ZEndTime < ZStartTime THEN _
  2851.         IF TestTime => ZStartTime OR TestTime <= ZEndTime THEN _
  2852.            GOTO 5155
  2853.      GOTO 5150
  2854. 5155 Found = ZTrue
  2855. 5160 ZErrCode = 0
  2856.      RETURN
  2857. 5200 CALL PageLen
  2858.      RETURN
  2859. '
  2860. ' ****  J - COMMAND FROM MAIN MENU (JOIN CONFERENCE)  ***
  2861. '
  2862. 5300 WasA1$ = ZConfMenu$
  2863.      CALL BreakFileName (ZActiveMessageFile$,MsgDrvPath$,WasX$,ZWasY$,ZTrue)
  2864.      CALL Talk (12,ZOutTxt$)
  2865. 5301 ZStackC = ZTrue
  2866.      CALL SubMenu ("What conference, L)ist, M)ain ([ENTER] quits)",_
  2867.          WasA1$,MsgDrvPath$,"M.DEF","M", _
  2868.          ZUserGraphicDefault$,ZTrue,ZFalse,ZFalse,"C.DEF",WasX,ZFalse)
  2869.      IF ZWasQ = 0 THEN _
  2870.         RETURN
  2871.      IF ZSubParm = -1 THEN _
  2872.         RETURN 10595
  2873. 5323 WasX = (ZWasZ$ = "M" OR ZWasZ$ = "MAIN")
  2874.      IF ZWasZ$ = ConfNameSave$ OR (WasX AND ZConfName$ = "MAIN") THEN _
  2875.         CALL QuickTPut1 ("You are already in " + ZWasZ$) : _
  2876.         RETURN _
  2877.      ELSE IF WasX THEN _
  2878.              GOTO 5350
  2879.      IF NOT ZOK THEN _
  2880.         GOTO 5300
  2881.      CLOSE 2
  2882. '
  2883. ' ****  UPDATE PREVIOUS MESSAGE BASE CHECKPOINT RECORD  ***
  2884. '
  2885. 5324 PrevConfName$ = ZConfName$
  2886.      ZConfName$ = ZWasZ$
  2887.      ConfFileName$ = ZConfName$
  2888.      PrevMsg$ = ZActiveMessageFile$
  2889.      ZActiveMessageFile$ = ZFileName$
  2890.      GOSUB 5343
  2891. '
  2892. ' ****  UPDATE PREVIOUS USER RECORD  ***
  2893. '
  2894. 5325 GOSUB 5380
  2895. '
  2896. ' *****  CHECK WHETHER HAVE SUBBOARD (I.E. CONFIG.DEF EXISTS)  ****
  2897. '
  2898. 5327 UserRecordHold$ = ZUserRecord$
  2899.      ConfModeSave = ZConfMode
  2900.      ZConfMode = ZTrue
  2901.      PrevUser$ = ZActiveUserFile$
  2902.      PrevIndex = ZUserFileIndex
  2903.      PrevMainUser$ = ZMainUserFile$
  2904.      PrevUSL = ZUserSecLevel
  2905.      PrevDef$ = ZCurDef$
  2906. 5328 WasX$ = ZConfName$ + _
  2907.           "C.DEF"
  2908.      CALL FindIt (WasX$)
  2909.      ZSubBoard = ZOK
  2910.      IF NOT ZSubBoard THEN _
  2911.         CALL BreakFileName (ZMainMsgFile$,MsgDrvPath$,ZWasDF$,ZWasY$,ZTrue) : _
  2912.         WasX$ = MsgDrvPath$ + WasX$ : _
  2913.         CALL FindIt (WasX$) : _
  2914.         ZSubBoard = ZOK
  2915.      IF ZSubBoard THEN _
  2916.         IF LEN(ZConfName$) = 6 THEN _
  2917.            IF LEFT$(ZConfName$,4) = "RBBS" AND RIGHT$(ZConfName$,1) = "P" THEN _
  2918.               ZSubBoard = ZFalse
  2919.      IF NOT ZSubBoard THEN _
  2920.         CALL BreakFileName (ZActiveUserFile$,UserDrvPath$,ZWasDF$,ZWasY$,ZTrue) : _
  2921.         WasX$ = UserDrvPath$ + _
  2922.              ZConfName$ + _
  2923.              "U.DEF" : _
  2924.         ZFileName$ = ZWelcomeFileDrvPath$ + _
  2925.                      ZConfName$ + _
  2926.                      "W.DEF" _
  2927.         ELSE CALL ReadDef (WasX$) : _
  2928.              IF ZErrCode > 0 THEN _
  2929.                 CALL UpdtCalr ("Error"+STR$(ZErrCode)+" reading config file "+WasX$,2) : _
  2930.                 ZErrCode = 0 : _
  2931.                 ZInConfMenu = ZFalse : _
  2932.                 ZOutTxt$ = "error reading subboard" : _
  2933.                 GOTO 5341 _
  2934.              ELSE WasX$ = ZMainUserFile$ : _
  2935.                   ZFileName$ = "" : _
  2936.                   CALL FindIt (ZMainMsgFile$) : _
  2937.                   IF NOT ZOK THEN _
  2938.                      ZOutTxt$ = "msg file missing for" : _
  2939.                      ZInConfMenu = ZFalse : _
  2940.                      GOTO 5341 _
  2941.                   ELSE ZActiveMessageFile$ = ZMainMsgFile$ : _
  2942.                        GOSUB 5343
  2943.      UpdateDate = ZTrue
  2944.      CALL FindIt (WasX$)
  2945.      IF ZOK THEN _
  2946.         GOTO 5330
  2947. '
  2948. ' *****  NO USER FILE - A PUBLIC CONFERENCE   ****
  2949. '
  2950.      ZMainUserFile$ = PrevMainUser$
  2951.      IF (ZUserSecLevel < AutoAddSec) THEN _
  2952.         GOTO 5340
  2953.      GOTO 5345
  2954.      'WasX$ = ZMainUserFile$
  2955.      'ZSysopPswd1$ = ""
  2956.      'ZSysopPswd2$ = ""
  2957. '
  2958. ' ****  CHECK CONFERENCE USER'S FILE  ***
  2959. '
  2960. 5330 ZActiveUserFile$ = WasX$
  2961.      IF ZMainUserFileIndex < 1 THEN _
  2962.         Found = ZFalse : _
  2963.         ZUserFileIndex = 0 : _
  2964.         GOTO 5335
  2965.      CALL WordInFile (ZConfMenu$,ZConfName$,ZInConfMenu)
  2966.      IF ZActiveUserName$ = "SYSOP" THEN _
  2967.         TempHashValue$ = ZOrigUserName$
  2968.      GOSUB 12598
  2969.      GOSUB 12984
  2970. 5335 IF Found THEN _
  2971.         GOSUB 9500 : _
  2972.         ZMainUserFileIndex = -(ZSubBoard * ZUserFileIndex)_
  2973.                                -((NOT ZSubBoard) * ZMainUserFileIndex) : _
  2974.         Temp = -(ZSubBoard * ZMinLogonSec) _
  2975.                -((NOT ZSubBoard) * AutoAddSec) : _
  2976.         WasI = (ZUserSecLevel < OrigMainSec) : _
  2977.         WasJ = (ZUserSecLevel < Temp) : _
  2978.         WasK = (WasI AND WasJ) : _
  2979.         IF WasK THEN _
  2980.            ZOutTxt$ = "you have been locked out of" : _
  2981.            GOTO 5341 _
  2982.         ELSE GOSUB 5375 : _
  2983.              GOTO 5345
  2984. '
  2985. ' **** USER NOT FOUND.  AUTO-ADD TO SUBBOARD IF SUFFICIENT SECURITY ***
  2986. '
  2987.      ZNewUser = ZTrue
  2988.      IF ZSubBoard THEN _
  2989.         AutoAddSec = ZMinLogonSec
  2990.      IF (ZOrigSec >= AutoAddSec) AND _
  2991.         (ZUserFileIndex > 0) AND (ZMainUserFileIndex > 0) THEN _
  2992.         LSET ZUserRecord$ = UserRecordHold$ : _
  2993.         CALL QuickTPut1 ("MEMBER privileges granted in " + ZConfName$) : _
  2994.         MID$(ZUserOption$,3,2) = MKI$(0) : _
  2995.         MID$(ZUserOption$,1,2) = MKI$(0) : _
  2996.         ZActiveUserName$ = LEFT$(UserRecordHold$,30) : _
  2997.         CALL Trim (ZActiveUserName$) : _
  2998.         Temp = -(ZSubBoard * ZDefaultSecLevel) _
  2999.                -((NOT ZSubBoard) * ZUserSecSave) : _
  3000.         CALL SetSysOp : _
  3001.         Temp = -(ZWasA * ZSysopSecLevel) - ((NOT ZWasA) * Temp) : _
  3002.         LSET ZSecLevel$ = MKI$(Temp) : _
  3003.         ZUserSecLevel = Temp : _
  3004.         GOSUB 5375 : _
  3005.         ZPageLength = ZPageLengthDef : _
  3006.         GOSUB 12986 : _
  3007.         GOSUB 12630 : _
  3008.         UpdateDate = ZTrue : _
  3009.         Found = ZTrue : _
  3010.         GOTO 5335
  3011.      IF ZOrigSec >= AutoAddSec THEN _
  3012.         CALL QuickTPut1 ("GUEST privileges granted in " + ZConfName$) : _
  3013.         ZActiveUserFile$ = PrevUser$ : _
  3014.         UpdateDate = ZFalse : _
  3015.         ZUserFileIndex = PrevIndex : _
  3016.         GOSUB 5382 : _
  3017.         ZUserFileIndex = 0 : _
  3018.         GOTO 5345
  3019.      ZNewUser = ZFalse
  3020. 5340 IF ZInConfMenu THEN _
  3021.         ZOutTxt$ = "you are not in conference" _
  3022.      ELSE ZOutTxt$ = "no such option"
  3023. 5341 ZOutTxt$ = ZOutTxt$ + " " + ZConfName$
  3024. '
  3025. ' ****  CANNOT JOIN THE REQUESTED CONFERENCE.  THEREFORE, GO BACK  ***
  3026. '
  3027.      GOSUB 1397
  3028.      ZConfName$ = PrevConfName$
  3029.      ConfFileName$ = ZConfName$
  3030.      IF ZSubBoard THEN _
  3031.         CALL ReadDef (PrevDef$)
  3032.      ZActiveMessageFile$ = PrevMsg$
  3033.      GOSUB 5343
  3034.      ZUserFileIndex = PrevIndex
  3035.      ZActiveUserFile$ = PrevUser$
  3036.      GOSUB 5382
  3037.      ZConfMode = ConfModeSave
  3038.      GOSUB 12987
  3039.      ZAnsIndex = 0
  3040.      ZLastIndex = 0
  3041.      GOTO 5301
  3042. '
  3043. ' ****  RESTORE A MESSAGE BASE   ***
  3044. '
  3045. 5343 GOSUB 5344
  3046.      GOSUB 23000
  3047.      RETURN
  3048. '
  3049. ' *****  OPEN AND SETUP MESSAGE BASE  *****
  3050. '
  3051. 5344 CALL OpenMsg
  3052.      IF ZErrCode = 64 THEN _
  3053.         ZErrCode = 0 : _
  3054.         GOTO 5350
  3055.      FIELD 1, 128 AS ZMsgRec$
  3056.      RETURN
  3057. '
  3058. ' *****  SUCCESSFUL CONFERENCE JOIN  ****
  3059. '
  3060. 5345 ZNewsFileName$ = ZWelcomeFileDrvPath$ + ZConfName$ + ".NWS"
  3061.      ConfNameSave$ = ZConfName$
  3062.      ZConfName$ = ZConfName$ + " " + MID$("ConferenceSubboard",1-10*ZSubBoard,10)
  3063.      IF ZGlobalSysop THEN _
  3064.         ZActiveUserName$ = "SYSOP"
  3065. 5347 GOSUB 4900
  3066. 5348 GOSUB 12987
  3067.      GOSUB 12990
  3068.      BoardCheckDate$ = LEFT$("00-00-00",-ZNewUser*8) + _
  3069.                        LEFT$(ZLastDateTimeOn$,-(NOT ZNewUser)*8)
  3070.      IF ZSubBoard THEN _
  3071.         ZHasDoored = ZFalse : _
  3072.         ZActiveFMSDir$ = "" : _
  3073.         ZTimeLoggedOn$ = TIME$ : _
  3074.         RETURN 108
  3075.      ZNewUser = ZFalse
  3076.      GOSUB 827
  3077.      IF UpdateDate THEN _
  3078.         ZTimeLoggedOn$ = TIME$ : _
  3079.         LSET ZLastDateTimeOn$ = ZCurDate$ + _
  3080.                                   " " + _
  3081.                                   ZTimeLoggedOn$ : _
  3082.         GOSUB 9440 : _
  3083.         GOSUB 12991
  3084.      IF PrevUSL <> ZUserSecLevel THEN _
  3085.         CALL SetPrompt
  3086.      GOSUB 1241
  3087.      RETURN 852
  3088. '
  3089. ' ****  JOIN M)AIN   ***
  3090. '
  3091. 5350 IF ZConfName$ <> "MAIN" THEN _
  3092.         CALL QuickTPut1 ("Rejoining " + OrigMsgName$)
  3093.      ConfFileName$ = OrigMsgName$
  3094.      ZNewsFileName$ = OrigNewsFileName$
  3095.      TurboLogon = ZTrue
  3096.      ZWasQ = 0
  3097.      ZNewUser = ZFalse
  3098.      ZInConfMenu = ZTrue
  3099.      IF ZActiveUserName$ = "SYSOP" THEN _
  3100.         ZActiveUserName$ = ZSysopPswd1$ + " " + ZSysopPswd2$ : _
  3101.         CALL Trim (ZActiveUserName$)
  3102.      ZConfigFileName$ = ZOrigCnfg$
  3103.      CALL ReadDef (ZConfigFileName$)
  3104.      IF ZOrigMsgFile$ <> ZActiveMessageFile$ THEN _
  3105.         ZActiveMessageFile$ = ZOrigMsgFile$ : _
  3106.         GOSUB 5343
  3107.      IF ZOrigUserFile$ <> ZActiveUserFile$ THEN _
  3108.         GOSUB 5380 : _
  3109.         ZActiveUserFile$ = ZOrigUserFile$ : _
  3110.         ZActiveUserName$ = ZOrigUserName$ : _
  3111.         GOSUB 12598 : _
  3112.         GOSUB 12990 : _
  3113.         IF Found THEN _
  3114.            GOSUB 9500 : _
  3115.            ZMainUserFileIndex = ZUserFileIndex : _
  3116.            CALL SetPrompt : _
  3117.            CALL XferType (2,ZTrue) _
  3118.         ELSE ZUserFileIndex = 0 : _
  3119.              ZMainUserFileIndex = 0
  3120.      CALL UpdtCalr ("Exited " + ZConfName$,3)
  3121.      ZConfName$ = "MAIN"
  3122.      ConfNameSave$ = ZConfName$
  3123.      GOSUB 2350
  3124.      ZUplds = ZGlobalUplds
  3125.      ZDnlds = ZGlobalDnlds
  3126.      ZDLToday! = ZGlobalDLToday!
  3127.      ZBytesToday! = ZGlobalBytesToday!
  3128.      ZDLBytes! = ZGlobalDLBytes!
  3129.      ZULBytes! = ZGlobalULBytes!
  3130. 5360 ZConfMode = ZFalse
  3131.      BoardCheckDate$ = ZLastDateTimeOn$
  3132.      ZSubBoard = ZTrue
  3133.      GOSUB 12987
  3134.      RETURN 108
  3135. 5370 ZRemoteSysop = (ZActiveUserName$ = ZSysopPswd1$ + " " + ZSysopPswd2$)
  3136.      ZWasA = ZRemoteSysop
  3137.      ZGlobalSysop = (ZGlobalSysop OR (ZWasA AND ZOrigCnfg$ = ZConfigFileName$))
  3138.      IF ZGlobalSysop THEN _
  3139.         ZWasA = ZTrue
  3140.      RETURN
  3141. 5375 IF ((ZUserSecLevel < ZAutoUpgradeSec) AND ZSubBoard) OR _
  3142.         ((ZUserSecLevel < OrigUpgradeSec) AND NOT ZSubBoard) THEN _
  3143.            IF ZUserSecLevel <> ZOrigSec THEN _
  3144.               ZUserSecLevel = ZOrigSec : _
  3145.               LSET ZSecLevel$ = MKI$(ZUserSecLevel)
  3146.      RETURN
  3147. '
  3148. ' *****  UPDATE CURRENT USERS RECORD  ****
  3149. '
  3150. 5380 IF ZUserFileIndex < 1 THEN _
  3151.         RETURN
  3152.      IF ZAdjustedSecurity AND NOT ZSysop THEN _
  3153.         LSET ZSecLevel$ = MKI$(ZUserSecLevel) : _
  3154.         ZUserSecSave = ZUserSecLevel
  3155.      CALL UpdateU (ZFalse)
  3156.      RETURN
  3157. '
  3158. ' *****  RESTORE A USER RECORD  ****
  3159. '
  3160. 5382 IF ZUserFileIndex < 1 THEN _
  3161.         ZUserSecLevel = ZDefaultSecLevel : _
  3162.         RETURN
  3163.      CALL OpenUser (HighestUserRecord)
  3164.      GET 5,ZUserFileIndex
  3165.      GOSUB 9500
  3166.      RETURN
  3167. '
  3168. ' *****  R - COMMAND FROM UTILITY MENU (REVIEW PROFILE)  ****
  3169. '
  3170. 5400 CALL SkipLine(2)
  3171.      CALL QuickTPut1 ("Your PROFILE")
  3172. 5410 CALL Toggle(-9)
  3173.      GOSUB 43020
  3174.      ZFF = INSTR(ZDefaultXfer$,ZUserXferDefault$)
  3175.      CALL Toggle(-5)
  3176.      GOSUB 42810
  3177.      CALL Toggle(-3)
  3178.      CALL Toggle(-6)
  3179.      CALL Toggle(-7)
  3180.      CALL Toggle(-10)
  3181.      CALL Toggle(-2)
  3182.      CALL Toggle(-4)
  3183.      CALL Toggle(-8)
  3184.      CALL Toggle(-1)
  3185.      IF ZRestrictByDate AND ZDaysInRegPeriod > 0 THEN _
  3186.         IF ZUserSecLevel > ZExpiredSec THEN _
  3187.            CALL QuickTPut1 ("Registration expires " + ZExpirationDate$)
  3188.      RETURN
  3189. '
  3190. ' *****  B - COMMAND FROM UTILITY MENU (300 TO 450 BAUD CHANGE)  ****
  3191. '
  3192. 5500 CALL Baud450
  3193.      IF ZLocalUser OR NOT (ZSubParm OR ZWasC = 20) THEN _
  3194.         RETURN
  3195. 5502 RETURN 10595  'Entry point when have double nested gosub
  3196. '
  3197. ' *****  V - COMMAND FROM MAIN MENU (VIEW CONFERENCES)  ****
  3198. '
  3199. 5800 CALL ConfMail (MailCheckConfirm)
  3200.      ConfMailJoin = (ZHomeConf$ <> "")
  3201.      RETURN
  3202. '
  3203. ' *  FORMAT MESSAGE HEADER INFORMATION FOR DISPLAY
  3204. '
  3205. 8000 IF ZRet THEN _
  3206.         RETURN
  3207. 8020 IF MID$(ZMsgRec$,37,5) = "ALL  " THEN _
  3208.         MsgTo$ = "ALL" : _
  3209.         GOTO 8040
  3210. 8030 MsgTo$ = MID$(ZMsgRec$,37,22)
  3211.      CALL Trim (MsgTo$)
  3212. 8040 IF LEN(MsgTo$) < 23 THEN _
  3213.         MsgTo$ = MsgTo$ + _
  3214.                       SPACE$(23 - LEN(MsgTo$))
  3215.      Subject$ = MID$(ZMsgRec$,76,25)
  3216.      CALL Trim (Subject$)
  3217.      CALL AllCaps (Subject$)
  3218.      OrigSubject$ = Subject$
  3219.      IF ZPswdFailed THEN _
  3220.         Subject$ = WasSJ$
  3221. 8050 MsgFrom$ = MID$(ZMsgRec$,6,31)
  3222.      CALL Trim (MsgFrom$)
  3223.      IF LEN(MsgFrom$) < 23 THEN _
  3224.         MsgFrom$ = MsgFrom$ + _
  3225.                         SPACE$(23 - LEN(MsgFrom$))
  3226.      IF ZUserSecLevel >= ZSecChangeMsg THEN _
  3227.         Year$ = "  Security:" + _
  3228.               STR$(MsgSec) _
  3229.         ELSE Year$ = ""
  3230.      IF MID$(ZMsgRec$,101,1) = "!" THEN _
  3231.         MID$(ZMsgRec$,1,1) = "!"
  3232.      ZOutTxt$ = ZFG1$ + "Msg #: " + _
  3233.           LEFT$(ZMsgRec$,5) + _
  3234.           Year$ + SPACE$ (22-LEN(Year$)) + ZConfName$
  3235.      Year$ = ZFG4$ + "   Sent: " + _
  3236.           MID$(ZMsgRec$,68,8) + _
  3237.           " " + _
  3238.           MID$(ZMsgRec$,59,5)
  3239.      IF NOT ZRet THEN _
  3240.         IF ReadMsgs THEN _
  3241.            CALL QuickTPut1 (ZOutTxt$): _
  3242.            WasX$ = MsgFrom$ : _
  3243.            CALL CheckColor (WasX$,SubInHeader$,ZFG2$) : _
  3244.            CALL QuickTPut1 (ZFG2$ + " From:  " + WasX$ + Year$) : _
  3245.            GOSUB 8076 : _
  3246.            WasX$ = MsgTo$ : _
  3247.            CALL CheckColor (WasX$,SubInHeader$,ZFG3$) : _
  3248.            CALL QuickTPut1 (ZFG3$ + "   To:  " + WasX$ + "  " + ZFG2$ + Year$) : _
  3249.            CALL CheckColor (Subject$,SubInHeader$,ZFG4$) : _
  3250.            ZOutTxt$ = ZFG4$ + "   Re:  " + _
  3251.                 Subject$ + ZEmphasizeOff$ _
  3252.         ELSE ZOutTxt$ = ZFG1$ + LEFT$(ZMsgRec$,5) + _
  3253.                   " " + _
  3254.                   MID$(ZMsgRec$,68,5) + _
  3255.                   " " + _
  3256.                   + ZFG2$ + LEFT$(MsgFrom$,18) + _
  3257.                   " -> " + _
  3258.                   + ZFG3$ + LEFT$(MsgTo$,19) + _
  3259.                   " " + _
  3260.                   + ZFG4$ + LEFT$(Subject$,24) + ZEmphasizeOff$ : _
  3261.              CALL CheckColor (ZOutTxt$,SubInHeader$,"") : _
  3262.              GOTO 8080
  3263.      IF QuickScanMsgs OR _
  3264.         ScanMsgs THEN _
  3265.            GOTO 8080 _
  3266.      ELSE GOTO 8077
  3267. 8076 IF MID$(ZMsgRec$,123,6) = STRING$(6,0) OR _
  3268.         MID$(ZMsgRec$,123,6) = SPACE$(6) THEN _
  3269.            Year$ = " Rcvd: -NO-" : _
  3270.            RETURN
  3271.      Year$ = " Rcvd: " + _
  3272.            RIGHT$(STR$(ASC(MID$(ZMsgRec$,123,1))),2) + _
  3273.            "-" + _
  3274.            RIGHT$(STR$(ASC(MID$(ZMsgRec$,124,1))),2) + _
  3275.            "-" + _
  3276.            RIGHT$(STR$(ASC(MID$(ZMsgRec$,125,1))),2) + _
  3277.            " " + _
  3278.            RIGHT$(STR$(ASC(MID$(ZMsgRec$,126,1))),2) + _
  3279.            ":" + _
  3280.            RIGHT$(STR$(ASC(MID$(ZMsgRec$,127,1))),2)
  3281.      FOR WasI = 8 TO 15
  3282.         IF MID$(Year$,WasI,1) = " " THEN _
  3283.            MID$(Year$,WasI,1) = "0"
  3284.      NEXT
  3285.      FOR WasI = 17 TO 21
  3286.         IF MID$(Year$,WasI,1) = " " THEN _
  3287.            MID$(Year$,WasI,1) = "0"
  3288.      NEXT
  3289.      RETURN
  3290. 8077 IF (NOT MsgToCaller) THEN _
  3291.         ZWasA = (MID$(ZMsgRec$,37,5) = "ALL  ") : _
  3292.         IF NOT ZWasA THEN _
  3293.            GOTO 8080
  3294.      IF MsgFromCaller AND NOT ZSysOp THEN _
  3295.         GOTO 8080
  3296.      Year$ = DATE$
  3297.      WasWK$ = TIME$
  3298.      MID$(ZMsgRec$,123,6) = CHR$(VAL(MID$(Year$,1,2))) + _
  3299.                                    CHR$(VAL(MID$(Year$,4,2))) + _
  3300.                                    CHR$(VAL(MID$(Year$,9,2))) + _
  3301.                                    CHR$(VAL(MID$(WasWK$,1,2))) + _
  3302.                                    CHR$(VAL(MID$(WasWK$,4,2))) + _
  3303.                                    CHR$(VAL(MID$(WasWK$,7,2)))
  3304.      GOSUB 12986
  3305.      PUT 1,ZMsgPtr(ZMsgDimIndex,1)
  3306.      GOSUB 12987
  3307. 8080 GOSUB 12979
  3308.      ZOutTxt$ = ""
  3309.      RETURN
  3310. '
  3311. ' * UNCOMPRESS MESSAGE PRIOR TO DISPLAY
  3312. '
  3313. 9000 IF NOT JustSearching THEN _
  3314.         GOSUB 4656: _
  3315.         CALL SkipLine (1) : _
  3316.         ZLinesInMsg = 1 : _
  3317.         MsgDimXtra = 150 : _
  3318.         REDIM ZOutTxt$(MsgDimXtra) : _
  3319.         Remain$ = "" : _
  3320.         HiLitedLine = 0
  3321.      FOR WasX = 2 TO VAL(MID$(ZMsgRec$,117,4))
  3322.         WasJ = 1
  3323.         GET 1
  3324.         IF JustSearching THEN _
  3325.            ZOutTxt$ = ZMsgRec$ : _
  3326.            CALL AllCaps (ZOutTxt$) : _
  3327.            HiLitePos = INSTR(ZOutTxt$,SearchString$) : _
  3328.            IF HiLitePos > 0 THEN _
  3329.               SearchCt = 0 : _
  3330.               HiLiteRec = LOC(1) : _
  3331.               WasX = 9999 : _
  3332.               GOTO 9090 _
  3333.            ELSE GOTO 9090
  3334. 9050    ZWasB = INSTR(WasJ,ZMsgRec$,CHR$(227))
  3335.         IF ZRet THEN _
  3336.            RETURN
  3337. 9060    ZWasC = ZWasB - WasJ
  3338.         IF ZWasC < 0 THEN _
  3339.            ZWasC = 128
  3340. 9070    ZOutTxt$ = MID$(ZMsgRec$,WasJ,ZWasC)
  3341.         IF HiLiteRec = LOC(1) THEN _
  3342.            IF HiLitePos >= WasJ AND HiLitePos < WasJ+ZWasC THEN _
  3343.               HiLiteRec = -1 : _
  3344.               Bracketed = ZTrue : _
  3345.               ZOutTxt$(0) = ZOutTxt$ : _
  3346.               CALL Bracket (ZOutTxt$,HiLitePos-WasJ+1,HiLitePos+LEN(SearchString$)-WasJ,ZEmphasizeOn$,ZEmphasizeOff$)
  3347.         IF ZWasB = 0 THEN _
  3348.            Remain$ = ZOutTxt$ : _
  3349.            GOTO 9090 _
  3350.         ELSE ZOutTxt$ = Remain$ + ZOutTxt$ : _
  3351.              Remain$ = "" : _
  3352.              WasJ = ZWasB + 1
  3353. 9085    IF LEFT$(ZOutTxt$,1) = ZStartOfHeader$ OR _
  3354.            LEFT$(ZOutTxt$,LEN(ZScreenOutMsg$)) = ZScreenOutMsg$ THEN _
  3355.            GOTO 9050
  3356.         ZOutTxt$(ZLinesInMsg) = ZOutTxt$
  3357.         IF Bracketed THEN _
  3358.            Bracketed = ZFalse : _
  3359.            HiLitedLine = ZLinesInMsg
  3360.         ZLinesInMsg = ZLinesInMsg + 1
  3361.         IF ZLinesInMsg > MsgDimXtra THEN _
  3362.            ZLinesInMsg = ZLinesInMsg - 1 : _
  3363.            CALL SkipLine (1) : _
  3364.            CALL QuickTPut1 ("Message too long.  Truncated to " + STR$(MsgDimXtra) + " lines!") : _
  3365.            ZOutTxt$ = "" : _
  3366.            RETURN
  3367.         IF NOT DontPrint THEN _
  3368.            GOSUB 12979 : _
  3369.            IF ZRet THEN _
  3370.               ZOutTxt$ = "" : _
  3371.               RETURN _
  3372.            ELSE CALL AskMore ("",ZTrue,ZTrue,ZAnsIndex,ZFalse) : _
  3373.                 IF ZNo THEN _
  3374.                    DontPrint = ZTrue
  3375.         GOTO 9050
  3376. 9090 NEXT
  3377.      IF DontPrint = ZTrue THEN _
  3378.         GOTO 5160
  3379.      IF JustSearching AND HiLitePos > 0 THEN _
  3380.         JustSearching = ZFalse : _
  3381.         GET 1,ZMsgPtr(ZMsgDimIndex,1) : _
  3382.         GOSUB 8000 : _
  3383.         GOTO 9000
  3384.      ZOutTxt$ = ""
  3385.      RETURN
  3386. '
  3387. ' *  C - COMMAND FROM UTILITY MENU (CLOCK - TIME ON SYSTEM)
  3388. '
  3389. 9100 CALL RptTime
  3390.      RETURN
  3391. '
  3392. ' * WRITE A RECORD TO THE RBBS-PC "USER" FILE
  3393. '
  3394. 9440 IF ZUserFileIndex > 0 AND ZUserFileIndex < 32768 THEN _
  3395.         PUT 5,ZUserFileIndex
  3396.      RETURN
  3397. '
  3398. ' * DEFINE USER FILE RECORD VARIABLES TO COMPENSATE FOR THE BUG IN QUICKBASIC
  3399. ' * THAT REQUIRES A FIELD STATMENT TO BE EXECUTED WITHIN EACH SEPARATELY
  3400. ' * COMPILED PROGRAM -- EVEN THOUGH A FIELD STATEMENT WAS EXECUTED WHEN THE
  3401. ' * FILE WAS OPENED IN ANOTHER SEPERATELY COMPILED SUBROUTINE
  3402. '
  3403. 9450 IF LOF(5) < 1 THEN _
  3404.         ZWasDF$ = ZActiveUserFile$ : _
  3405.         RETURN 13600
  3406.      FIELD 5,31 AS ZUserName$, _
  3407.              15 AS ZPswd$, _
  3408.               2 AS ZSecLevel$, _
  3409.              14 AS ZUserOption$,  _
  3410.              24 AS ZCityState$, _
  3411.               3 AS MachineType$, _
  3412.               4 AS ZTodayDl$, _
  3413.               4 AS ZTodayBytes$, _
  3414.               4 AS ZDlBytes$, _
  3415.               4 AS ZULBytes$, _
  3416.              14 AS ZLastDateTimeOn$, _
  3417.               3 AS ZListNewDate$, _
  3418.               2 AS ZUserDnlds$, _
  3419.               2 AS ZUserUplds$, _
  3420.               2 AS ZElapsedTime$
  3421.      FIELD 5,128 AS ZUserRecord$
  3422.      RETURN
  3423. '
  3424. ' * GET USER DEFAULTS
  3425. '
  3426. 9500 GOSUB 9450
  3427.      CALL SetSysOp
  3428.      CALL SetUserPref
  3429.      RETURN
  3430. '
  3431. ' *  B - COMMAND FROM MAIN MENU (READ BULLETINS)
  3432. '
  3433. 9700 ReturnOn$ = "*SN"
  3434.      WasA1$ = ZBulletinMenu$
  3435. 9701 CALL SubMenu ("Read what bulletin(s), L)ist, S)ince, N)ews ([ENTER] = none)",_
  3436.                    WasA1$, ZBulletinPrefix$,"",ReturnOn$,_
  3437.                    ZUserGraphicDefault$,ZFalse,ZFalse,ZFalse,"",WasX,ZTrue)
  3438.      IF ZWasQ = 0 THEN _
  3439.         RETURN
  3440.      CALL CheckCarrier
  3441.      IF ZSubParm = -1 THEN _
  3442.         RETURN 10595
  3443.      IF (ZWasZ$ = "*" OR ZWasZ$ = "S") THEN _
  3444.         ZPrevPrefix$ = "" : _
  3445.         GOTO 9760
  3446.      ZStopInterrupts = ZFalse
  3447.      IF ZWasZ$ = "N" THEN _
  3448.         GOSUB 1242 : _
  3449.         IF WasZ <> 0 THEN _
  3450.            CALL QuickTPut1 ("No NEWS available") : _
  3451.            GOTO 9701 _
  3452.         ELSE GOTO 9703
  3453.      CALL BufFile (ZFileName$,ZAnsIndex)
  3454. 9703 CALL UpdtCalr ("Read bulletin " + ZFileName$,1)
  3455.      GOTO 9701
  3456. '
  3457. ' *  CHECK AND REVIEW NEW BULLETINS SINCE Last LOGON
  3458. '
  3459. 9750 CALL CheckNewBul (BoardCheckDate$,NumNewBullets,NewBullets$)
  3460.      RETURN
  3461. 9760 ' ****  [entry when want review plus chance to read] *********
  3462.      GOSUB 9750
  3463.      IF NumNewBullets > 0 THEN _
  3464.         ZLastIndex = NumNewBullets + 1 : _
  3465.         ZOutTxt$ = "Read ALL new bulletins ([Y],N)" : _
  3466.         GOSUB 12999 : _
  3467.         IF NOT ZNo THEN _
  3468.            ZAnsIndex = 1: _
  3469.            GOTO 9700
  3470.      ZLastIndex = 0
  3471.      IF ZAnsIndex < 1 THEN _
  3472.         RETURN
  3473.      GOTO 9701
  3474.  
  3475. ' *  W - COMMAND FROM MAIN MENU (WHO'S ON THE OTHER NODES)
  3476. '
  3477. 9800 CALL WhosOn (NodesInSystem)
  3478.      GOSUB 5344
  3479.      RETURN
  3480. '
  3481. ' *  1 - COMMAND FROM SYSOP MENU (DISPLAY COMMENTS)
  3482. '
  3483. 10070 CALL Muzak (7)
  3484.       ZFileName$ = ZCmntsFile$
  3485.       IF NOT ZStopInterrupts THEN _
  3486.          ZOutTxt$ = "* Ctrl-K(^K) / ^X aborts. ^S suspends, ^Q resumes *" : _
  3487.          GOSUB 12976
  3488.       GOSUB 20150
  3489.       RETURN
  3490. '
  3491. ' *  U - COMMAND FROM UTILITY MENU (DISPLAY USERS)
  3492. ' *  2 - COMMAND FROM SYSOP MENU (DISPLAY USERS)
  3493. '
  3494. 10090 CALL Muzak (6)
  3495.       ZOutTxt$ = "List - U)sers, R)ecent callers"
  3496.       ZMacroMin = 2
  3497.       CALL SkipLine (1)
  3498.       GOSUB 12930
  3499.       IF ZWasQ = 0 THEN _
  3500.          RETURN
  3501.       CALL AraAllCaps (ZUserIn$(),ZAnsIndex)
  3502.       ON INSTR("UR",ZUserIn$(ZAnsIndex)) + 1 GOTO 10090,10096,10093
  3503. 10093 CALL DispCall
  3504.       RETURN
  3505. 10096 UserRecordHold$ = ZUserRecord$
  3506.       GOSUB 12700
  3507.       CALL OpenUser (HighestUserRecord)
  3508.       GOSUB 9450
  3509.       ZStopInterrupts = ZFalse
  3510.       WasI = 1
  3511.       ZWasZ$ = ZSysopPswd1$ + " " + ZSysopPswd2$
  3512. 10097 IF WasI > HighestUserRecord OR ZRet THEN _
  3513.          GOTO 10099
  3514.       GET 5,WasI
  3515.       WasX$ = MID$(ZUserRecord$,ZStartHash,ZLenHash)
  3516.       IF ASC(WasX$)=0 OR LEFT$(WasX$,3)="   " THEN _
  3517.          GOTO 10098
  3518.       IF INSTR(WasX$,ZWasZ$) > 0 OR ZSysopSecLevel <= CVI(MID$(ZUserRecord$,47,2)) THEN _
  3519.          IF NOT ZSysop THEN _
  3520.             GOTO 10098
  3521.       CALL AskMore ("",ZTrue,ZTrue,WasXX,ZFalse)
  3522.       IF ZNo OR ZSubParm = -1 THEN _
  3523.          GOTO 10099
  3524.       ZOutTxt$ = LEFT$(WasX$,36) + ZCityState$ + ZLastDateTimeOn$
  3525.       GOSUB 12979
  3526. 10098 WasI = WasI + 1
  3527.       GOTO 10097
  3528. 10099 ZOutTxt$ = ""
  3529.       LSET ZUserRecord$ = UserRecordHold$
  3530.       ZStopInterrupts = ZTrue
  3531.       RETURN
  3532. '
  3533. ' *  3 - COMMAND FROM SYSOP MENU (RECOVER MESSAGES)
  3534. '
  3535. 10390 MsgRecovered = ZFalse
  3536. 10391 ZOutTxt$ = "Recover Msg #" + ZPressEnter$
  3537.       GOSUB 12932
  3538.       CALL CheckInt (ZUserIn$(ZAnsIndex))
  3539.       IF ZErrCode <> 0 THEN _
  3540.          GOTO 10391
  3541.       MsgToRecover = ZTestedIntValue
  3542.       IF MsgToRecover < 1 THEN _
  3543.          GOTO 10392
  3544.       GOSUB 5344
  3545.       ActionFlag = ZFalse
  3546.       CALL RecoverMsg (MsgToRecover,FirstMsgRecord,ActionFlag)
  3547.       MsgRecovered = MsgRecovered OR ActionFlag
  3548.       GOTO 10391
  3549. 10392 IF MsgRecovered THEN _
  3550.          ActionFlag = ZTRUE : _
  3551.          GOTO 1900
  3552.       RETURN
  3553. '
  3554. ' *  4 - COMMAND FROM SYSOP MENU (DELETE COMMENTS)
  3555. '
  3556. 10530 ZOutTxt$ = "Delete comments (Y/[N])"
  3557.       GOSUB 12995
  3558.       IF ZYes THEN _
  3559.          CALL OpenOutW (ZCmntsFile$)
  3560.       CLOSE 2
  3561. 10550 RETURN
  3562. '
  3563. ' *  TIME LIMIT EXCEEDED EXIT
  3564. '
  3565. 10553 CALL UpdtCalr ("Time limit exceeded",1)
  3566.       CALL QuickTPut1 ("You have no time left")
  3567. '
  3568. ' *  Q - COMMAND FROM GLOBAL FUNCTIONS
  3569. '
  3570. 10560 GOSUB 9100
  3571.       IF ZUserSecLevel < ZSecExemptFromEpilog THEN _
  3572.            ZFileName$ = ZEpilog$ : _
  3573.            GOSUB 11520
  3574.       IF ZLocalUserMode OR NOT ZLocalUser THEN _
  3575.          CALL UpdtCalr ("Logged off",1)
  3576.       CALL Muzak (4)
  3577.       GOTO 10595
  3578. 10570 IF MinsRemaining > 1 AND (ZTurboKeyUser OR NOT ZExpertUser) THEN _
  3579.          ZOutTxt$ = "Log off (Y,[N])" : _
  3580.          GOSUB 12930 : _
  3581.          IF NOT ZYes THEN _
  3582.             RETURN
  3583.       GetOut = ZTrue
  3584.       GOTO 10560
  3585. 10590 CALL UpdtCalr ("Sleep Disconnect",1)
  3586.       ZSubBoard = ZFalse
  3587. 10595 CALL GetTime
  3588.       GOSUB 13700
  3589.       ZSubParm = 0
  3590.       CALL Carrier
  3591.       IF ZSubParm = -1 THEN _
  3592.          GOTO 10597
  3593.       IF ZConfName$ = OrigMsgName$ THEN _
  3594.          GetOut = ZTrue
  3595.       IF (ZSubBoard AND (NOT GetOut) AND (NOT ZSleepDisconnect)) THEN _
  3596.          GOSUB 5380 : _
  3597.          ZHomeConf$ = "M" : _
  3598.          CALL QuickTPut1 ("Time limit exceeded in " + ZConfName$) : _
  3599.          ZSubBoard = ZFalse : _
  3600.          GOTO 1205
  3601. 10597 CALL UpdateU (ZTrue)
  3602.       GOTO 13540
  3603. 10620 CALL UpdtCalr(ZWasLG$(ZLogonErrorIndex),2)
  3604.       IF ZExitToDoors THEN _
  3605.          CALL UpdateU (ZTrue)
  3606. 10621 IF ZActiveUserName$ = "" THEN _
  3607.          ZActiveUserName$ = "NAME UNAVAILABLE"
  3608.       ZWasZ$ = ZActiveUserName$ + _
  3609.            " on at " + _
  3610.            ZCurDate$ + _
  3611.            ", " + _
  3612.            ZTime$ + _
  3613.            "** LOGON DENIED **, " + _
  3614.            ZBaudParity$
  3615.       ZWasNG$ = ZWasZ$ + _
  3616.             SPACE$(128 - LEN(ZWasZ$))
  3617. 10698 CALL Muzak (5)
  3618.       IF ZFunctionKey = 22 THEN _
  3619.          GOTO 13545
  3620.       ZOutTxt$ = "Access denied!"
  3621.       GOSUB 12976
  3622.       CALL DelayTime (8 + ZBPS)
  3623.       GOTO 13545
  3624. '
  3625. ' *  M - COMMAND FROM UTILITY MENU (CHANGE MARGINS)
  3626. '
  3627. 10925 UtilMarginChange = ZTrue
  3628.       GOSUB 3100
  3629.       UtilMarginChange = ZFalse
  3630.       RETURN
  3631. '
  3632. ' *  7 - COMMAND FROM SYSOP MENU (EXIT TO DOS)
  3633. '
  3634. 10930 IF (ZRequiredRings = 0 AND NOT ZNoDoorProtect) THEN _
  3635.          CALL QuickTPut1 ("Remote DOS unavailable") : _
  3636.          RETURN
  3637. 10932 IF ZLocalUser AND NOT ZDebug THEN _
  3638.          CALL QuickTPut1 ("Only for remote SYSOP's") : _
  3639.          RETURN
  3640.       CALL DosExit
  3641.       ZSubParm = -9
  3642.       CALL FindFKey
  3643.       GOTO 202
  3644. '
  3645. ' *  D - COMMAND FROM MAIN MENU (EXIT TO DOORS)
  3646. '
  3647. 10970 IF NOT ZDoorsAvail OR _
  3648.          (ZRequiredRings = 0 AND NOT ZNoDoorProtect) THEN _
  3649.          CALL QuickTPut1 ("No doors available") : _
  3650.          RETURN
  3651.       IF ZTimeLock AND 1 AND NOT ZHasDoored THEN _
  3652.          CALL TimeLock : _
  3653.          IF NOT ZOK THEN _
  3654.             RETURN
  3655. 10974 WasA1$ = ZMenu$(5)
  3656.       CALL Talk (5,ZOutTxt$)
  3657.       ZStackC = ZTrue
  3658.       CALL SubMenu ("Open which door, L)ist" + ZPressEnterExpert$, _
  3659.                     WasA1$,"",".BAT","",_
  3660.                     ZUserGraphicDefault$,ZTrue,ZFalse,ZFalse,"",InMenu,ZFalse)
  3661.       IF ZWasQ = 0 THEN _
  3662.          RETURN
  3663.       IF ZSubParm = -1 THEN _
  3664.          RETURN 10595
  3665. 10986 ZWasZ$ = ZFileName$
  3666.       CALL DoorExit (NOT InMenu)
  3667.       GOTO 10974
  3668. '
  3669. ' *  5 - COMMAND FROM SYSOP MENU (USER FILE MAINTENANCE)
  3670. '
  3671. 11000 WasTU = ZUserFileIndex
  3672.       CALL DefaultU
  3673.       UserRecordHold$ = ZUserRecord$
  3674.       RegDateHold$ = ZRegDate$
  3675.       UserSecLevelSave = ZUserSecLevel
  3676. 11001 ZStopInterrupts = ZTrue
  3677.       WasI = 1
  3678.       ScanUsers = ZFalse
  3679.       IF EditFromRead = 1 THEN GOTO 11341
  3680.       ZOutTxt$ = "A)dd, L)st, P)rt, M)od, S)can users"
  3681.       GOSUB 12930
  3682. 11003 IF ZWasQ = 0 THEN _
  3683.       IF EditFromRead > 0 THEN _
  3684.          GOTO 11325 _
  3685.       ELSE _
  3686.          ZUserFileIndex = WasTU : _
  3687.          GOTO 20093
  3688.       WasQQ = 0
  3689.       ZWasZ$ = LEFT$(ZUserIn$(ZAnsIndex),1)
  3690.       CALL AllCaps (ZWasZ$)
  3691.       IF ZWasZ$ = "A" THEN _
  3692.          GOTO 12300 _
  3693.       ELSE IF ZWasZ$ = "M" THEN _
  3694.               ZStopInterrupts = ZTrue _
  3695.            ELSE IF ZWasZ$ = "P" THEN _
  3696.                    WasQQ = ZTrue _
  3697.                 ELSE IF ZWasZ$ = "S" THEN _
  3698.                         ScanUsers = ZTrue : _
  3699.                         ZStopInterrupts = ZTrue _
  3700.                      ELSE IF ZWasZ$ <> "L" THEN _
  3701.                              GOTO 11001
  3702. 11005 CALL OpenUser (HighestUserRecord)
  3703.       GOSUB 9450
  3704.       WasZ = 1
  3705.       IF ScanUsers THEN _
  3706.          ZOutTxt$ = "Scan for N)ame, P)wd, C)" + ZUserLocation$ + ", L)evel" + _
  3707.               LEFT$(", H)ash id",-9*(ZStartHash > 1 AND ZLenHash > 0)) : _
  3708.          GOSUB 12930 : _
  3709.          ZOutTxt$ = "" : _
  3710.          ScanFunction$ = LEFT$(ZUserIn$(1),1) : _
  3711.          CALL AllCaps (ScanFunction$) : _
  3712.          ZCR = 0 : _
  3713.          GOSUB 12979 : _
  3714.          GOSUB 12966 : _
  3715.          GOTO 12962
  3716. 11010 FOR WasJ = WasZ TO HighestUserRecord
  3717.          GET 5,WasJ
  3718. 11015    WasX$ = MID$(ZUserRecord$,ZStartHash,ZLenHash)
  3719.          IF ASC(WasX$) = 0 OR LEFT$(WasX$,3) = "   " THEN _
  3720.             GOTO 11310
  3721.          WasOF = CVI(ZSecLevel$)
  3722.          IF WasOF > ZUserSecLevel THEN _
  3723.             IF NOT ZGlobalSysop THEN _
  3724.                GOTO 11310
  3725.          ZOutTxt$ = ZFG4$ + RIGHT$("     " + STR$(LOC(5)),4) + _
  3726.               ":" + _
  3727.               ZFG1$ + ZUserName$ + _
  3728.               ZFG2$ + "SECURITY" + _
  3729.               RIGHT$("      " + STR$(WasOF),6) + _
  3730.               " "
  3731. 11020    ZOutTxt$ = ZOutTxt$ + _
  3732.               ZFG3$ + "Password= " + _
  3733.               ZPswd$ + ZEmphasizeOff$
  3734.          GOSUB 11120
  3735.          IF WasOF < OrigMainSec THEN _
  3736.             ZOutTxt$ = ZEmphasizeOn$ + "<Locked out>" + ZEmphasizeOff$ + SPACE$(7) : _
  3737.             GOTO 11030
  3738.          IF WasOF >= ZSysopSecLevel THEN _
  3739.             ZOutTxt$ = ZEmphasizeOn$ + "  (SYSOP)  " + ZEmphasizeOff$ + SPACE$(8) : _
  3740.             GOTO 11030
  3741.          ZOutTxt$ = SPACE$(19)
  3742. 11030    ZOutTxt$ = ZOutTxt$ + _
  3743.               ZLastDateTimeOn$ + _
  3744.              "   " + _
  3745.              ZFG4$ + ZCityState$ + ZEmphasizeOff$
  3746.          GOSUB 11120
  3747.          ZOutTxt$ = "  DOWNLOADS = " + _
  3748.              RIGHT$("     " + STR$(CVI(ZUserDnlds$)),5) + _
  3749.              "   " + _
  3750.              "UPLOADS = " + _
  3751.              RIGHT$("     " + STR$(CVI(ZUserUplds$)),5) + _
  3752.              "   " + _
  3753.              " Times on ="
  3754.           ZOutTxt$ = ZOutTxt$ + RIGHT$("     " + STR$(CVI(MID$(ZUserOption$,1,2))),5) + _
  3755.              "   " + _
  3756.              "TIME USED = " + _
  3757.              RIGHT$("    " + STR$(CVI(ZElapsedTime$)),4) + _
  3758.              " Min"
  3759.          GOSUB 11120
  3760.          IF NOT ZEnforceRatios THEN _
  3761.             GOTO 11106
  3762.          ZOutTxt$ = "BYTES: Dwn=" + STR$(CVS(ZDlBytes$)) + _
  3763.               "  Up=" + STR$(CVS(ZULBytes$)) + _
  3764.               " TODAY Dwn: #=" + STR$(CVS(ZTodayDl$)) + _
  3765.               " Bytes=" + STR$(CVS(ZTodayBytes$))
  3766.          GOSUB 11120
  3767.  
  3768. 11106   IF (ZStartIndiv = 0 OR ZLenIndiv = 0) AND _
  3769.            (ZStartHash = 0 OR ZLenHash = 0) AND _
  3770.            NOT ZRestrictByDate THEN _
  3771.               GOTO 11107
  3772.         IF (ZStartHash > 1 AND ZLenHash > 0) THEN _
  3773.            ZOutTxt$ = "Hash: " + MID$(ZUserRecord$,ZStartHash,ZLenHash) _
  3774.         ELSE ZOutTxt$ = ""
  3775.         IF (ZStartIndiv > 1 AND ZLenIndiv > 0) THEN _
  3776.            ZOutTxt$ = ZOutTxt$ + " Indiv: " + MID$(ZUserRecord$,ZStartIndiv,ZLenIndiv)
  3777.         IF ZRestrictByDate THEN _
  3778.             GOSUB 11480 : _
  3779.             ZOutTxt$ = ZOutTxt$ + "  Registered: " + _
  3780.                  RegDisplayDate$
  3781.         CALL QuickTPut1 (ZOutTxt$)
  3782.         IF WasQQ THEN _
  3783.            CALL Printit (ZOutTxt$)
  3784.         IF ZRet <> 0 THEN _
  3785.            GOTO 11330
  3786. 11107   IF NOT ZStopInterrupts THEN _
  3787.            GOTO 11310
  3788. 11110   ZOutTxt$ = "D)el  F)ind  M)enu  N)ewPW  P)rnt  R)eset Grfx  Q)uit"
  3789.         GOSUB 1512
  3790.         ZOutTxt$ = "S)ecLvl  U)ser#  X)fer Cnts  T)ime Used  B)aud Change"
  3791.         IF ZRestrictByDate THEN _
  3792.            ZOutTxt$ = ZOutTxt$ + _
  3793.                 " $)RegDate"
  3794.         GOSUB 12930
  3795.         IF NOT ScanUsers AND ZWasQ = 0 THEN _
  3796.            GOTO 11310
  3797. 11115   ZWasZ$ = LEFT$(ZUserIn$(ZAnsIndex),1)
  3798.         CALL AllCaps (ZWasZ$)
  3799.         WasX = INSTR("DNPQFSMR$UX",ZWasZ$)
  3800.         IF ZWasZ$ = "" AND ScanUsers THEN _
  3801.            GOTO 12965
  3802.         ON WasX GOTO 11130,11160,11220,11320,11340,11390,11330,11400,11450,11127,11490
  3803.         GOTO 11110
  3804. 11120   IF WasQQ THEN _
  3805.             CALL Printit (ZOutTxt$)
  3806.         CALL QuickTPut1 (ZOutTxt$)
  3807.         IF ZRet <> 0 THEN _
  3808.            RETURN 11330
  3809.         RETURN
  3810.  
  3811. 11125   WasZ = VAL(ZUserIn$)
  3812.         IF WasZ < 1 OR WasZ > HighestUserRecord THEN _
  3813.            GOTO 11127
  3814.         GOTO 11010
  3815. 11127   ZOutTxt$ = "What record #"
  3816.         GOSUB 12932
  3817.         GOTO 11125
  3818. '
  3819. ' *  D - COMMAND FROM 5- USER MAINTENANCE OPTIONS (DELETE USER)
  3820. '
  3821. 11130   ZOutTxt$ = "Delete user (Y/[N])"
  3822.         GOSUB 12995
  3823.         IF ZYes THEN _
  3824.            LSET ZUserName$ = CHR$(0) + _
  3825.                              "deleted user" : _
  3826.            LSET ZSecLevel$ = MKI$(ZMinLogonSec - 1) : _
  3827.            LSET ZLastDateTimeOn$ = "01-01-80" + _
  3828.                                      " " + _
  3829.                                      ZTimeLoggedOn$
  3830.         GOTO 11290
  3831. '
  3832. ' *  N - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER PASSWORD)
  3833. '
  3834. 11160   GOSUB 12800
  3835.         GOTO 11290
  3836. '
  3837. ' *  P - COMMAND FROM 5- USER MAINTENANCE OPTIONS (PRINT USER FILE)
  3838. '
  3839. 11220   WasQQ = NOT WasQQ
  3840.         GOTO 11015
  3841. 11290   ZUserFileIndex = LOC(5)
  3842.         GOSUB 12989
  3843.         GOSUB 9440
  3844.         GOSUB 12991
  3845.         ZUserFileIndex = 0
  3846.         GOTO 11015
  3847. 11310   IF ScanUsers THEN _
  3848.            GOTO 12965
  3849. 11311 NEXT
  3850. '
  3851. ' *  Q - COMMAND FROM 5- USER MAINTENANCE OPTIONS (QUIT TO MAIN MENU)
  3852. '
  3853. 11320 ZUserFileIndex = WasTU
  3854.       LSET ZUserRecord$ = UserRecordHold$
  3855.       ZRegDate$ = RegDateHold$
  3856.       IF EditFromRead > 0 THEN _
  3857.          GOTO 11325
  3858.       RETURN 1200
  3859. 11325 ZReply = ZFalse
  3860.       JustReplied = ZTrue
  3861.       QuotedReply = ZTrue
  3862.       EditFromRead = 0
  3863.       CALL GetMsgAttr
  3864.       DontPrint = ZTrue
  3865.       ZUserIn$ = "="
  3866.       GOTO 4560
  3867. '
  3868. ' *  M - COMMAND FROM 5- USER MAINTENANCE OPTIONS (MAIN USER MAINT. MENU)
  3869. '
  3870. 11330 CLOSE 2
  3871.       IF EditFromRead > 0 THEN _
  3872.          EditFromRead = 2
  3873.       GOTO 11001
  3874. '
  3875. ' *  F - COMMAND FROM 5- USER MAINTENANCE OPTIONS (FIND USER)
  3876. '
  3877. 11340 ZOutTxt$ = ZPromptHash$ + _
  3878.            " to find"
  3879.       CALL SkipLine (1)
  3880.       ZParseOff = ZTrue
  3881.       GOSUB 12932
  3882.       IF ZWasQ = 0 THEN _
  3883.          GOTO 11340
  3884.       TempHashValue$ = ZUserIn$
  3885. 11341 IF LEN(TempHashValue$) < 3 OR LEN(TempHashValue$) > ZLenHash THEN _
  3886.          GOTO 11340
  3887.       CALL AllCaps (TempHashValue$)
  3888.       IF ZStartIndiv < 1 THEN _
  3889.          GOTO 11345
  3890. 11342 ZOutTxt$ = ZPromptIndiv$ + _
  3891.            " to find"
  3892.       GOSUB 12995
  3893.       IF ZWasQ = 0 THEN _
  3894.          GOTO 11342
  3895.       TempIndivValue$ = ZUserIn$
  3896.       IF LEN(TempIndivValue$) > ZLenIndiv THEN _
  3897.          GOTO 11342
  3898.       CALL AllCaps (TempIndivValue$)
  3899. 11345 GOSUB 12600
  3900.       GOSUB 12990
  3901.       GOSUB 12987
  3902.       ZUserFileIndex = 0
  3903.       IF Found THEN _
  3904.          GOTO 11015
  3905. 11380 ZOutTxt$ = TempHashValue$ + _
  3906.            " " + _
  3907.            TempIndivValue$ + _
  3908.            " not found"
  3909.       GOSUB 12977
  3910.       GOTO 11310
  3911. '
  3912. ' *  S - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER SECURITY)
  3913. '
  3914. 11390 GOSUB 11395
  3915.       LSET ZSecLevel$ = MKI$(WasOF)
  3916.       GOTO 11290
  3917. 11395 ZOutTxt$ = "New sec level"
  3918.       GOSUB 12932
  3919.       ZWasZ$ = ZUserIn$(ZAnsIndex)
  3920.       WasOF = VAL(ZWasZ$)
  3921.       IF WasOF > ZUserSecLevel THEN _
  3922.          WasOF = ZUserSecLevel
  3923.       RETURN
  3924. '
  3925. ' *  R - COMMAND FROM 5- USER MAINTENANCE OPTIONS (RESET USER GRAPHICS)
  3926. '
  3927. 11400 ZWasA = CVI(MID$(ZUserOption$,9,2))
  3928.       ZWasA = ZWasA AND &HFAFF                ' TURN HIGHLIGHTING OFF
  3929.       LSET ZUserOption$ = LEFT$(ZUserOption$,5) + _
  3930.                            "0" + _
  3931.                            MID$(ZUserOption$,7,2) + _
  3932.                            MKI$(ZWasA) + _
  3933.                            MID$(ZUserOption$,11)
  3934.       GOTO 11290
  3935. '
  3936. ' *  $ - COMMAND FROM 5 - USER MAINTENANCE (CHANGE REGISTRATION DATE)
  3937. '
  3938. 11450 ZOutTxt$ = "Enter new registration date (MM-DD-YY)"
  3939.       GOSUB 12932
  3940.       IF ZWasQ = 0 THEN _
  3941.          GOTO 11015
  3942. 11455 WorkDate$ = ZUserIn$(ZAnsIndex)
  3943.       IF LEN(WorkDate$) < 8 THEN _
  3944.          GOTO 11450
  3945.       GOSUB 11470
  3946.       IF NOT ZOK THEN _
  3947.          GOTO 11450
  3948.       LSET ZUserOption$ = LEFT$(ZUserOption$,10) + _
  3949.                            ZRegDate$ + _
  3950.                            MID$(ZUserOption$,13)
  3951.       GOSUB 11480
  3952.       ZRegDate$ = RegDateHold$
  3953.       GOTO 11290
  3954. '
  3955. ' *  CALCULATE REGISTRATION DATES
  3956. '
  3957. 11470 IF LEN(WorkDate$) < 10 THEN _
  3958.          WorkDate$ = LEFT$(WorkDate$,6) + _
  3959.                       "19" + _
  3960.                       RIGHT$(WorkDate$,2)
  3961.       TodayRegYY = VAL(MID$(WorkDate$,7))
  3962.       TodayRegMM = VAL(LEFT$(WorkDate$,2))
  3963.       TodayRegDD = VAL(MID$(WorkDate$,4,2))
  3964.       ZOK = TodayRegYY > 1979 AND TodayRegMM > 0 AND _
  3965.            TodayRegMM < 13 AND TodayRegDD > 0 AND _
  3966.            TodayRegDD < 32
  3967.       IF ZOK THEN _
  3968.          CALL TwoByteDate (TodayRegYY,TodayRegMM,TodayRegDD,ZRegDate$)
  3969.       RETURN
  3970. 11480 WasX$ = MID$(ZUserOption$,11,2)
  3971.       IF CVI(WasX$) <> 0 THEN _
  3972.          ZRegDate$ = WasX$ : _
  3973.       ELSE GOSUB 11482
  3974.       CALL UnPackDate (ZRegDate$,ZUserRegYY,ZUserRegMM,ZUserRegDD,RegDisplayDate$)
  3975.       IF CVI(WasX$) = 0 THEN _
  3976.          RegDisplayDate$ = "00-00-00"
  3977.       RETURN
  3978. 11482 WorkDate$ = DATE$
  3979.       GOTO 11470
  3980. '
  3981. ' *  X - COMMAND FROM 5 - USER MAINTENANCE (CHANGE XFER COUNTERS)             *
  3982. '
  3983. 11490 CALL QuickTPut1 ("[ENTER] leaves unchanged")
  3984.       ZOutTxt$ = "Upload file total"
  3985.       GOSUB 12995
  3986.       IF LEN(ZUserIn$(1)) > 0 THEN _
  3987.          LSET ZUserUplds$ = MKI$(VAL(ZUserIn$(1)))
  3988.       ZOutTxt$ = "Upload BYTE total"
  3989.       GOSUB 12995
  3990.       IF LEN(ZUserIn$(1)) > 0 THEN _
  3991.          LSET ZULBytes$ = MKS$(VAL(ZUserIn$(1)))
  3992.       ZOutTxt$ = "Download file total"
  3993.       GOSUB 12995
  3994.       IF LEN(ZUserIn$(1)) > 0 THEN _
  3995.          LSET ZUserDnlds$ = MKI$(VAL(ZUserIn$(1)))
  3996.       ZOutTxt$ = "Download BYTE total"
  3997.       GOSUB 12995
  3998.       IF LEN(ZUserIn$(1)) > 0 THEN _
  3999.          LSET ZDlBytes$ = MKS$(VAL(ZUserIn$(1)))
  4000.       ZOutTxt$ = "Files downloaded TODAY"
  4001.       GOSUB 12995
  4002.       IF LEN(ZUserIn$(1)) > 0 THEN _
  4003.          LSET ZTodayDl$ = MKS$(VAL(ZUserIn$(1)))
  4004.       ZOutTxt$ = "Bytes downloaded TODAY"
  4005.       GOSUB 12995
  4006.       IF LEN(ZUserIn$(1)) > 0 THEN _
  4007.          LSET ZTodayBytes$ = MKS$(VAL(ZUserIn$(1)))
  4008.       GOTO 11290
  4009. '
  4010. ' *  ALLOW USERS TO ANSWER A "QUESTIONNAIRE" BASED ON THE RBBS-PC SCRIPT
  4011. '
  4012. 11520 CALL AskUsers
  4013.       IF NOT ZOK THEN _
  4014.          RETURN
  4015.       IF ZAdjustedSecurity THEN _
  4016.          GOSUB 12989 : _
  4017.          LSET ZSecLevel$ = MKI$(ZUserSecLevel) : _
  4018.          GOSUB 9440 : _
  4019.          GOSUB 12991 : _
  4020.          CALL SetPrompt : _
  4021.          CALL XferType (2,ZTrue) : _
  4022.          GOSUB 5135
  4023.       REDIM ZOutTxt$(ZMsgDim)
  4024.       IF ZSubParm = -1 THEN _
  4025.          RETURN 10595
  4026.       ZOK = ZTrue
  4027.       RETURN
  4028. '
  4029. ' *  A - COMMAND FROM 5- USER MAINTENANCE OPTIONS (ADD USER)
  4030. '
  4031. 12300 WasA1$ = ""
  4032.       Attempts = 0
  4033.       FirstNameSave$ = ZFirstName$
  4034.       LastNameSave$ = ZLastName$
  4035.       ActiveUserNameSave$ = ZActiveUserName$
  4036.       CityStateSave$ = ZWasCI$
  4037.       HashValueSave$ = HashValue$
  4038.       IndivValueSave$ = ZIndivValue$
  4039.       GOSUB 12500
  4040.       GOSUB 12840
  4041.       GOSUB 12850
  4042.       GOSUB 12598
  4043.       IF ZUserFileIndex = 0 THEN _
  4044.          GOSUB 12984 : _
  4045.          GOTO 12330
  4046.       IF Found THEN _
  4047.          WasD$ = "User already exists" : _
  4048.          GOSUB 1315 : _
  4049.          GOSUB 12984 : _
  4050.          GOTO 12330
  4051. 12310 GOSUB 12630
  4052.       GOSUB 12800
  4053.       GOSUB 11395
  4054.       ZTempSecLevel = WasOF
  4055.       GOSUB 12900
  4056.       LSET ZLastDateTimeOn$ = ZCurDate$ + _
  4057.                                 " " + _
  4058.                                 ZTimeLoggedOn$
  4059.       GOSUB 12960
  4060.       CALL AllCaps (ZUserIn$)
  4061.       LSET ZCityState$ = ZUserIn$
  4062.       LSET ZElapsedTime$ = MKI$(0)
  4063.       IF ZStartHash > 1 THEN _
  4064.          MID$(ZUserRecord$,ZStartHash,ZLenHash) = HashValue$
  4065.       IF ZStartIndiv > 1 THEN _
  4066.          MID$(ZUserRecord$,ZStartIndiv,ZLenIndiv) = ZIndivValue$
  4067.       GOSUB 9440
  4068. 12320 GOSUB 12991
  4069. 12330 ZUserSecLevel = UserSecLevelSave
  4070.       ZFirstName$ = FirstNameSave$
  4071.       ZLastName$ = LastNameSave$
  4072.       ZActiveUserName$ = ActiveUserNameSave$
  4073.       ZWasCI$ = CityStateSave$
  4074.       HashValue$ = HashValueSave$
  4075.       ZIndivValue$ = IndivValueSave$
  4076.       ZUserFileIndex = WasTU
  4077.       LSET ZUserRecord$ = UserRecordHold$
  4078.       GOTO 11001
  4079. '
  4080. ' *  GET USER First AND Last NAMES
  4081. '
  4082. 12500 IF Attempts > 5 THEN _
  4083.          ZFF = ZTrue : _
  4084.          RETURN
  4085. 12510 GOSUB 12700
  4086.       Attempts = Attempts + 1
  4087.       ZOutTxt$ = WasA1$ + _
  4088.            ZFirstNamePrompt$
  4089.       CALL SkipLine (1)
  4090.       ZLogonActive = ZTrue
  4091.       GOSUB 12555
  4092.       ZLogonActive = ZFalse
  4093.       CALL Trim (ZWasZ$)
  4094.       ZFirstName$ = ZWasZ$
  4095. 12530 ZOutTxt$ = WasA1$ + _
  4096.            ZLastNamePrompt$
  4097.       ZParseOff = ZTrue
  4098.       GOSUB 12555
  4099. 12540 CALL Trim (ZWasZ$)
  4100.       ZLastName$ = ZWasZ$
  4101.       IF LEN(ZLastName$) < 2 THEN _
  4102.          IF LEN(ZFirstName$) > 2 THEN _
  4103.             GOTO 12500
  4104.       IF (LEN(ZFirstName$) + LEN(ZLastName$)) > 30 THEN _
  4105.          GOTO 12500
  4106.       IF UserSecLevelSave < ZSysopSecLevel THEN _
  4107.          IF (LEN(ZFirstName$) < 2 OR LEN(ZLastName$) < 2) THEN _
  4108.             GOTO 12500 _
  4109.          ELSE IF LEFT$(ZFirstName$,1)=" " OR LEFT$(ZLastName$,1)=" " THEN _
  4110.                  GOTO 12500
  4111. 12550 ZActiveUserName$ = MID$(ZFirstName$ + " " + ZLastName$,1,31)
  4112.       IF HashIndiv > 1 THEN _
  4113.          IF ZWasQ < 3 THEN _
  4114.             GOSUB 12558 : _
  4115.             IF ZNo THEN _
  4116.                GOTO 12500
  4117.       ZWasZ$ = ZFirstName$
  4118.       RETURN
  4119. '
  4120. ' *  CHECK FOR NAMES NOT ALLOWED
  4121. '
  4122. 12555 GOSUB 12932
  4123.       IF ZWasQ = 0 THEN _
  4124.          RETURN 12500
  4125. 12556 ZWasZ$ = ZUserIn$(ZAnsIndex)
  4126. 12557 CALL AllCaps (ZWasZ$)
  4127.       CALL RemNonAlf (ZWasZ$,31,91)
  4128.       RETURN
  4129. 12558 ZOutTxt$ = "Are you '" + _
  4130.            ZActiveUserName$ + _
  4131.            "' ([Y],N)"
  4132.       GOSUB 12995
  4133.       RETURN
  4134. 12570 Found = ZFalse
  4135.       CALL OpenWork (2,ZTrashcanFile$)
  4136.       IF ZErrCode <> 0 THEN _
  4137.          ZErrCode = 0 : _
  4138.          RETURN
  4139. 12580 IF EOF(2) THEN _
  4140.          RETURN
  4141.       INPUT #2,InvalidName$
  4142.       IF ZWasZ$ <> InvalidName$ THEN _
  4143.          GOTO 12580
  4144.       Found = ZTrue
  4145.       RETURN
  4146. 12595 CALL QuickTPut1 ("Name not valid here. Call recorded")
  4147.       CALL UpdtCalr ("Name violation: "+ZActiveUserName$,1)
  4148.       GOTO 10621
  4149. '
  4150. ' *  COMMON SEARCH USER FILE ROUTINE
  4151. '
  4152. 12598 TempHashValue$ = HashValue$
  4153.       TempIndivValue$ = ZIndivValue$
  4154. 12600 GOSUB 4910
  4155.       GOSUB 12988
  4156.       IF ZInConfMenu THEN _
  4157.          IF NOT ZPrivateDoor THEN _
  4158.             CALL QuickTPut1 ("Checking Users...")
  4159. 12605 CALL OpenUser (HighestUserRecord)
  4160.       GOSUB 9450
  4161.       CALL FindUser (TempHashValue$,TempIndivValue$,ZStartHash,ZLenHash,_
  4162.                      ZStartIndiv,ZLenIndiv,HighestUserRecord,Found,_
  4163.                      ZUserFileIndex,ZWasSL)
  4164.      IF Found THEN _
  4165.         RETURN
  4166.      IF CurUserCount < (HighestUserRecord-1)*.95 THEN _
  4167.         RETURN
  4168.      ZOutTxt$ = "No room for new users in " + ZConfName$
  4169.      CALL UpdtCalr (ZOutTxt$,2)
  4170.      IF ZActiveUserFile$ <> ZMainUserFile$ THEN _
  4171.         ZUserFileIndex = 0 : _
  4172.         RETURN
  4173.       IF ZRememberNewUsers AND NOT ZSurviveNoUserRoom THEN _
  4174.          GOSUB 1397
  4175.       ZUserFileIndex = 0
  4176.       IF ZSurviveNoUserRoom THEN _
  4177.          ZRememberNewUsers = ZFalse
  4178.       RETURN
  4179. '
  4180. ' *  AUGMENT USER COUNT, LOCK 4 REC BLOCK IN USER, UNLOCK FILES
  4181. '
  4182. 12630 GOSUB 23000
  4183.       CurUserCount = CurUserCount + (ZWasSL = 0) * ZRememberNewUsers
  4184. 12632 GOSUB 24000
  4185.       GOSUB 12985
  4186.       IF ZRememberNewUsers THEN _
  4187.          GOSUB 12989
  4188.       GOSUB 12990
  4189.       RETURN
  4190. '
  4191. ' *  INFORM USER OF WHAT CONFERENCE USER FILE HE IS VIEWING
  4192. '
  4193. 12700 IF ZConfMode THEN _
  4194.          ZOutTxt$ = "Users of " + _
  4195.               ZConfName$ + _
  4196.               ":" : _
  4197.          GOSUB 12979
  4198.       RETURN
  4199. '
  4200. ' *  GET PASSWORD FROM NEWUSER
  4201. '
  4202. 12800 CALL NewPassword ("Enter PASSWORD you'll use to logon again",ZFalse)
  4203.       IF ZSubParm < 0 THEN _
  4204.          GOTO 202
  4205.       IF UserSecLevelSave < ZSysopSecLevel THEN _
  4206.          IF ZUserIn$ = SPACE$(LEN(ZUserIn$)) THEN _
  4207.             GOTO 12800
  4208.       LSET ZPswd$ = ZWasZ$
  4209.       RETURN
  4210. '
  4211. ' *  GET HASH VALUE FOR CURRENT USER TO LOOK UP IN THE USER'S FILE
  4212. '
  4213. 12840 IF ZStartHash = 1 THEN _
  4214.          HashValue$ = ZActiveUserName$ : _
  4215.          RETURN
  4216.       WasX$ = WasA1$ + _
  4217.            ZPromptHash$
  4218.       CALL UntilRight (WasX$,HashValue$,2,ZLenHash)
  4219.       RETURN
  4220. '
  4221. ' *  GET FIELD TO INDIVIDUATE ONE USER FROM ANOTHER (NAME FIELD IS DEFAULT)
  4222. '
  4223. 12850 IF ZStartIndiv < 1 OR ZLenIndiv < 1 THEN _
  4224.          RETURN
  4225.       IF ZStartIndiv = 1 THEN _
  4226.          ZIndivValue$ = ZActiveUserName$ : _
  4227.          RETURN
  4228.       IF ZExitToDoors THEN _
  4229.          RETURN
  4230.       WasX$ = WasA1$ + _
  4231.            ZPromptIndiv$
  4232.       CALL UntilRight (WasX$,ZIndivValue$,2,ZLenIndiv)
  4233.       RETURN
  4234. '
  4235. ' *  SET NEWUSER DEFAULTS
  4236. '
  4237. 12900 LSET ZUserName$ = ZActiveUserName$
  4238.       LSET ZUserOption$ = MKI$(0) + _
  4239.                            MKI$(0) + _
  4240.                            " 0" + _
  4241.                            MKI$(64) + _
  4242.                            MKI$(16) + _
  4243.                            MKI$(0) + _
  4244.                            CHR$(23) + _
  4245.                            ZDefaultEchoer$
  4246.       LSET ZUserDnlds$ = MKI$(0)
  4247.       LSET ZUserUplds$ = MKI$(0)
  4248.       IF ZEnforceRatios THEN _
  4249.          LSET ZTodayDl$ = MKS$(0) : _
  4250.          LSET ZTodayBytes$ = MKS$(0) : _
  4251.          LSET ZDlBytes$ = MKS$(0) : _
  4252.          LSET ZULBytes$ = MKS$(0)
  4253.       LSET ZSecLevel$ = MKI$(ZTempSecLevel)
  4254.       LSET ZElapsedTime$ = MKI$(0)
  4255.       RETURN
  4256. 12930 ZTurboKey = -ZTurboKeyUser
  4257. 12932 CALL PopCmdStack
  4258.       GOTO 12997
  4259. '
  4260. ' *  GET CITY AND STATE FROM NEWUSER
  4261. '
  4262. 12960 ZOutTxt$ = WasA1$ + _
  4263.            ZUserLocation$
  4264.       GOSUB 12995
  4265.       IF ZWasQ = 0 THEN _
  4266.          GOTO 12960
  4267.       IF ZUserIn$ = SPACE$(LEN(ZUserIn$)) THEN _
  4268.          GOTO 12960
  4269.       CALL AllCaps (ZUserIn$)
  4270.       LSET ZCityState$ = ZUserIn$
  4271.       ZWasCI$ = ZUserIn$
  4272.       RETURN
  4273. '
  4274. ' *  S - COMMAND FROM 5 - USER MAINTENANCE OPTIONS (SCAN USERS)
  4275. '
  4276. 12962 WasX = 0
  4277.       ZFF = ZFalse
  4278.       ZMacroMin = 99
  4279.       ZOutTxt$ = "String to search"
  4280.       GOSUB 12998
  4281.       IF ZWasQ = 0 THEN _
  4282.          GOTO 11001
  4283.       CALL AllCaps (ZUserIn$)
  4284.       WasWK$ = ZUserIn$
  4285.       IF ScanFunction$ = "L" THEN _
  4286.          WasWK$ = "," + _
  4287.                STR$(VAL(WasWK$)) + _
  4288.                ","
  4289. 12963 GET 5,WasI
  4290.       GOSUB 12966
  4291.       WasX = INSTR(ScanField$,WasWK$)
  4292.       IF WasX > 0 THEN _
  4293.          GOTO 11015
  4294. 12965 WasI = WasI + 1
  4295.       IF WasI > HighestUserRecord THEN _
  4296.          LSET ZUserRecord$ = UserRecordHold$ : _
  4297.          GOTO 11001
  4298.       WasX = 0
  4299.       GOTO 12963
  4300. 12966 ZFF = INSTR("NCPLH",ScanFunction$)
  4301. 12967 ON ZFF GOTO 12968,12969,12970,12972,12971
  4302.       GOTO 11001
  4303. '
  4304. ' *  N - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR NAME)
  4305. '
  4306. 12968 ScanField$ = ZUserName$
  4307.       RETURN
  4308. '
  4309. ' *  C - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR CITY/ST)
  4310. '
  4311. 12969 ScanField$ = ZCityState$
  4312.       RETURN
  4313. '
  4314. ' *  P - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR PASSWORD)
  4315. '
  4316. 12970 ScanField$ = ZPswd$
  4317.       RETURN
  4318. '
  4319. ' *  H - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR HASH ID)
  4320. '
  4321. 12971 IF ZStartHash > 0 AND ZLenHash > 0 THEN _
  4322.          ScanField$ = MID$(ZUserRecord$,ZStartHash,ZLenHash)
  4323.       RETURN
  4324. '
  4325. ' *  L - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR LEVEL)
  4326. '
  4327. 12972 ScanField$ = "," + _
  4328.                     STR$(CVI(ZSecLevel$)) + _
  4329.                     ","
  4330.       RETURN
  4331. '
  4332. ' * CALLS INTO SEPARATELY COMPILED SUBROUTINES (RBBS-SUB)
  4333. '
  4334. '
  4335. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL OUTPUT ROUTINE
  4336. '
  4337. 12975 ZSubParm = 1
  4338.       GOTO 12981
  4339. 12976 ZSubParm = 2
  4340.       GOTO 12981
  4341. 12977 ZSubParm = 3
  4342.       GOTO 12981
  4343. 12978 ZSubParm = 4     ' no cr/lf
  4344.       GOTO 12981
  4345. 12979 ZSubParm = 5     ' cr/lf
  4346.       GOTO 12981
  4347. 12980 ZSubParm = 6
  4348. 12981 CALL TPut
  4349. 12983 IF ZSubParm < 0 THEN _
  4350.          GOTO 202
  4351.       IF ZSubParm = 8 THEN _
  4352.          GOSUB 12995
  4353.       RETURN
  4354. '
  4355. ' * STANDARD ENTRY FOR RBBS-PC'S FILE LOCKING WHEN RUNNING MULTIPLE RBBS-PC'S
  4356. '
  4357. 12984 ZSubParm = 1  ' LOCK USERS & MESSAGES
  4358.       GOTO 12994
  4359. 12985 ZSubParm = 2  ' UNLOCK MESSAGES AND FLUSH
  4360.       Flushed = ZTrue
  4361.       GOTO 12994
  4362. 12986 ZSubParm = 3  ' LOCK MESSAGES
  4363.       GOTO 12994
  4364. 12987 ZSubParm = 4  ' UNLOCK MESSAGES
  4365.       GOTO 12994
  4366. 12988 ZSubParm = 5  ' LOCK USERS
  4367.       GOTO 12994
  4368. 12989 ZSubParm = 6  ' LOCK USER BLOCK
  4369.       GOTO 12994
  4370. 12990 ZSubParm = 7  ' UNLOCK USERS
  4371.       GOTO 12994
  4372. 12991 ZSubParm = 8  ' UNLOCK USER BLOCK
  4373.       GOTO 12994
  4374. 12992 ZSubParm = 9  ' LOCK COMMENTS/UPLOAD DIR
  4375.       GOTO 12994
  4376. 12993 ZSubParm = 10 ' UNLOCK COMMENTS/UPLOAD DIR
  4377. 12994 CALL FileLock
  4378.       IF Flushed THEN _
  4379.          FIELD 1,128 AS ZMsgRec$ : _
  4380.          Flushed = ZFalse
  4381.       IF ZSubParm = -1 THEN _
  4382.          ZSubParm = -9 : _
  4383.          CALL FindFKey : _
  4384.          GOTO 202
  4385.       RETURN
  4386. '
  4387. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL INPUT ROUTINE
  4388. '
  4389. 12995 GOSUB 12997
  4390.       ZSubParm = 1
  4391. 12996 CALL TGet
  4392. 12997 IF ZSubParm < 0 THEN _
  4393.          GOTO 202
  4394.       RETURN
  4395. 12998 ZOutTxt$ = ZOutTxt$ + _
  4396.            ZPressEnter$
  4397.       GOTO 12995
  4398. 12999 ZTurboKey = -ZTurboKeyUser
  4399.       GOTO 12995
  4400. '
  4401. ' *  MAIN SYSTEM ERROR TRAP - ALL ERRORS PASS THROUGH THIS ROUTINE
  4402. '
  4403. 13000 IF ZDebug THEN _
  4404.          ZOutTxt$ = "DEBUG Trap ERL=" + _
  4405.               STR$(ZWasEL) + _
  4406.               " ERR=" + _
  4407.               STR$(ZErrCode) : _
  4408.               CALL Printit(ZOutTxt$) : _
  4409.               WasD$ = ZOutTxt$ : _
  4410.               GOSUB 1315
  4411.       IF ZWasEL = 1905 AND ZErrCode = 63 THEN _
  4412.          CLOSE 1 : _
  4413.          KILL ZActiveMessageFile$ : _
  4414.          GOTO 5350
  4415.       IF ZWasEL = 4371 AND ZErrCode = 6 THEN _
  4416.          GOTO 1200
  4417.       IF ZWasEL =  4740 THEN _
  4418.          GOTO 4745
  4419.       IF ZWasEL =  5151 AND ZErrCode = 62 THEN _
  4420.          CALL UpdtCalr (ZPswdFile$ + " bad format!",2) : _
  4421.          GOTO 5160
  4422. 13500 CALL LogError
  4423.       CALL QuickTPut1 (ZCallersRecord$)
  4424.       GOTO 1200
  4425. '
  4426. ' * COMMON EXIT FROM RBBS-PC (I.E. "ABANDON ALL HOPE OH YE WHO ENTER HERE")
  4427. '
  4428. 13538 CALL UpdtCalr ("No calls.  Recycling.",1)
  4429.       GOTO 13549
  4430. 13540 IF ZLocalUser AND ZSysop THEN _
  4431.          IF NOT ZLocalUserMode THEN _
  4432.             GOTO 13549
  4433. 13543 IF (NOT ZSysop) THEN _
  4434.          IF ((ZUserFileIndex = 0 AND ZRememberNewUsers) OR _
  4435.             ZNewUser = ZTrue) THEN _
  4436.             GOTO 13549
  4437. 13545 CALL UpdateC
  4438. 13549 GOSUB 13700
  4439.       IF ZLocalUser OR _
  4440.          ZModemOffHook THEN _
  4441.          GOTO 13555
  4442.       IF NOT ZFossil THEN _
  4443.          OUT ZModemCntlReg,INP(ZModemCntlReg) AND 254 : _
  4444.          CALL DelayTime (ZDTRDropDelay) : _
  4445.          OUT ZModemCntlReg,INP(ZModemCntlReg) OR 1 : _
  4446.          GOTO 13553
  4447. 13550 CALL FosStatus(ZComPort,Status)
  4448.       Status = Status AND &H4000
  4449.       IF Status <> &H4000 THEN _
  4450.          CALL DelayTime (8 + ZBPS)
  4451.       State=0
  4452.       CALL FosDTR(ZComPort,State)
  4453.       CALL DelayTime (ZDTRDropDelay)
  4454.       State=1
  4455.       CALL FosDTR(ZComPort,State)
  4456. 13553 CALL DelayTime (ZDTRDropDelay)
  4457.       CALL TakeOffHook
  4458. 13555 ZActiveMessageFile$ = ZOrigMsgFile$
  4459.       GOSUB 12986
  4460.       GOSUB 5344
  4461.       GET 1,ZNodeRecIndex
  4462.       MID$(ZMsgRec$,57,1) = "I"
  4463.       MID$(ZMsgRec$,40,2) = " 0"
  4464.       MID$(ZMsgRec$,72,2) = " 0"
  4465.       IF MID$(ZMsgRec$,101,2) = ZCarriageReturn$+ZCarriageReturn$ THEN _
  4466.          MID$(ZMsgRec$,101,2) = " 0"
  4467.       PUT 1,ZNodeRecIndex
  4468.       GOSUB 12985
  4469.       CLOSE 1,2,4,5
  4470.       IF NOT ZFossil THEN _
  4471.          CLOSE 3
  4472.       IF ZRecycleToDos THEN _
  4473.          GOTO 203
  4474.       RUN 100
  4475. 13600 CLS
  4476.       LOCATE ,,0
  4477.       CALL PScrn (ZWasDF$ + " file missing/invalid.  Run CONFIG")
  4478.       CALL DelayTime (3)
  4479.       GOTO 203
  4480. 13700 IF ZMsgFileLock THEN _
  4481.          GOSUB 12987
  4482. 13710 IF ZUserFileLock THEN _
  4483.          GOSUB 12990
  4484. 13720 IF ZUserBlockLock THEN _
  4485.          GOSUB 12991
  4486.       RETURN
  4487. '
  4488. ' *  C/R - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (QUIT TO MAIN MENU)
  4489. '
  4490. 20093 LSET ZUserRecord$ = UserRecordHold$
  4491.       GOSUB 9500
  4492. 20095 RETURN 1200
  4493. '
  4494. ' *  V - COMMAND FROM FILES MENU (VIEW ARC CONTENTS)
  4495. '
  4496. 20140 CALL GetArc
  4497.       IF ZSubParm = -1 THEN _
  4498.          GOTO 13540
  4499.       IF ZDenyAccess THEN _
  4500.          GOTO 1386
  4501.       RETURN
  4502. '
  4503. ' * GO TO THE FILE SYSTEM TO LIST THE SYSOP'S COMMENTS
  4504. '
  4505. 20150 ZFileSysParm = 1
  4506.       GOTO 20200
  4507. '
  4508. ' * GO TO THE FILE SYSTEM TO LIST THE FILE DIRECTORIES
  4509. '
  4510. 20155 ZFileSysParm = 2
  4511.       GOTO 20200
  4512. '
  4513. ' * GO TO THE FILE SYSTEM TO DOWNLOAD FILES
  4514. '
  4515. 20160 ZFileSysParm = 3
  4516.       GOTO 20200
  4517. '
  4518. ' * GO TO THE FILE SYSTEM WHEN RETURNING FROM EXTERNAL PROTOCOLS
  4519. '
  4520. 20165 ZFileSysParm = 4
  4521.       GOTO 20200
  4522. '
  4523. ' * GO TO THE FILE SYSTEM TO UPLOAD FILES
  4524. '
  4525. 20170 ZFileSysParm = 5
  4526.       GOTO 20200
  4527. '
  4528. ' * GO TO THE FILE SYSTEM TO SCAN FILE SYSTEM DIRECTORIES
  4529. '
  4530. 20175 ZFileSysParm = 6
  4531.       GOTO 20200
  4532. '
  4533. ' * GO TO THE FILE SYSTEM TO HANDLE "PERSONAL" FILES
  4534. '
  4535. 20180 ZFileSysParm = 7
  4536.       GOTO 20200
  4537. '
  4538. ' * GO TO THE FILE SYSTEM TO LIST "NEW" FILES
  4539. '
  4540. 20185 ZFileSysParm = 8
  4541.       GOTO 20200
  4542. '
  4543. ' * RETURN TO THE FILE SYSTEM AFTER HANDLING EXTENDED FILE DESCRIPTIONS
  4544. '
  4545. 20190 ZFileSysParm = 9
  4546. 20200 CALL FileSystem
  4547.       ON ZFileSysParm GOTO 20205, _
  4548.                                 20210, _
  4549.                                 20215, _
  4550.                                 20220, _
  4551.                                 20225, _
  4552.                                 20230, _
  4553.                                 20235
  4554. 20205 RETURN
  4555. 20210 RETURN 202
  4556. 20215 RETURN 1200
  4557. 20220 RETURN 1380
  4558. 20225 ZSysopComment = ZTrue
  4559.       ZMaxMsgLines = ZMaxExtendedLines
  4560.       GOSUB 2008
  4561.       GOTO 20190
  4562. 20230 RETURN 10553
  4563. 20235 RETURN 10595
  4564. '
  4565. ' *  GET MESSAGE HEADER RECORD DATA
  4566. '
  4567. 23000 GET 1,1
  4568.       HighMsgNumber = VAL(LEFT$(ZMsgRec$,8))
  4569.       AutoAddSec   = CVI(MID$(ZMsgRec$,9,2))
  4570.       CallsToDate! = VAL(MID$(ZMsgRec$,11,10))
  4571.       CurUserCount = VAL(MID$(ZMsgRec$,57,5))
  4572.       FirstMsgRecord = VAL(MID$(ZMsgRec$,68,7))
  4573.       ZNextMsgRec = VAL(MID$(ZMsgRec$,75,7))
  4574.       HighestMsgRecord = VAL(MID$(ZMsgRec$,82,7))
  4575.       IF ZActiveMessageFile$ = ZOrigMsgFile$ THEN _
  4576.          NodesInSystem = VAL(MID$(ZMsgRec$,127))
  4577.       RETURN
  4578. 23100 GET 1,ZNextMsgRec
  4579.       IF MID$(ZMsgRec$,61,1) = ":" THEN _
  4580.          CALL CheckInt (MID$(ZMsgRec$,117,4)) : _
  4581.          IF ZErrCode = 0 AND (ZTestedIntValue > 1) AND (ZTestedIntValue < 100) THEN _
  4582.             WasY = ZTestedIntValue : _
  4583.             CALL CheckInt (MID$(ZMsgRec$,2,4)) : _
  4584.             IF ZErrCode = 0 AND ZTestedIntValue > HighMsgNumber THEN _
  4585.                HighMsgNumber = ZTestedIntValue : _
  4586.                ZNextMsgRec = ZNextMsgRec + WasY : _
  4587.                CALL QuickTPut1 ("Fixing Msg Header") : _
  4588.                MsgCorrected = ZTrue : _
  4589.                GOTO 23100
  4590.       RETURN
  4591. '
  4592. ' *  UPDATE MESSAGE HEADER RECORD DATA
  4593. '
  4594. 24000 MID$(ZMsgRec$,1,8) = STR$(HighMsgNumber)
  4595.       MID$(ZMsgRec$,11,10) = STR$(CallsToDate!)
  4596.       MID$(ZMsgRec$,57,5) = STR$(CurUserCount)
  4597.       MID$(ZMsgRec$,68,7) = STR$(FirstMsgRecord)
  4598.       MID$(ZMsgRec$,75,7) = STR$(ZNextMsgRec)
  4599.       MID$(ZMsgRec$,82,7) = STR$(HighestMsgRecord)
  4600.       PUT 1,1
  4601.       RETURN
  4602. '
  4603. ' * A - COMMAND FROM Library MENU (ARCHIVE A SELECTED Library DISK)
  4604. '
  4605. 30000 ZSubParm = 4
  4606.       CALL Library
  4607.       IF ZSubParm = -1 THEN _
  4608.          RETURN 10595
  4609.       RETURN
  4610. '
  4611. ' * C - COMMAND FROM Library MENU (CHANGE TO A Library DISK)
  4612. '
  4613. 30100 ZSubParm = 2
  4614.       CALL Library
  4615.       RETURN
  4616. '
  4617. ' * D - COMMAND FROM Library MENU (DOWNLOAD A DISK/FILE FROM Library)
  4618. '
  4619. 30200 IF ZTimeLock AND 2 AND NOT ZHasPrivDoor THEN _
  4620.          CALL TimeLock : _
  4621.          IF NOT ZOK THEN _
  4622.             RETURN
  4623.       IF ZLibDiskChar$ = "0000" THEN _
  4624.          CALL QuickTPut1 ("You must select a Library disk first!") : _
  4625.          RETURN
  4626.       ZSubParm = 3
  4627.       CALL Library
  4628.       GOTO 20160
  4629. '
  4630. ' * CALCULATE TIME REMAINING FOR USER
  4631. '
  4632. 41000 CALL CheckTimeRemain (MinsRemaining)
  4633.       IF ZSubParm = -1 THEN _
  4634.          RETURN 10553
  4635.       RETURN
  4636. '
  4637. ' * SHOW USER CURRENT ACCESS LEVEL
  4638. '
  4639. 41070 ZOutTxt$ = "Granted access level" + _
  4640.            STR$(ZUserSecLevel) + _
  4641.            MID$(" (SYSOP)",1,-8 * (ZUserSecLevel >= ZSysopSecLevel))
  4642.       GOSUB 12975
  4643.       RETURN
  4644. '
  4645. ' * NULLS SET FOR NEW USERS
  4646. '
  4647. 42700 CALL SkipLine (1)
  4648.       CALL QuickTPut1 ("TurboKey: act on 1 char command without waiting for [ENTER]")
  4649.       ZOutTxt$ = "Want TurboKeys (Y/[N])"
  4650.       GOSUB 12999
  4651.       ZTurboKeyUser = NOT ZYes
  4652.       CALL Toggle (8)
  4653.       RETURN
  4654. '
  4655. ' *  F - COMMAND FROM UTILITY MENU (FILE Transfer DEFALUT MODE)
  4656. ' *  FILE Transfer DEFAULT SET FOR NEW USERS
  4657. '
  4658. 42800 ZFF = INSTR(ZDefaultXfer$,ZUserXferDefault$)
  4659.       IF ZFF = 0 THEN _
  4660.          ZFF = INSTR(ZInternalEquiv$,"N")
  4661.       CALL QuickTPut1 ("Current Protocol: "+MID$(ZDefaultXfer$,ZFF,1))
  4662. 42805 ZOutTxt$ = "Default "
  4663.       CALL XferType (3,ZExpertUser)
  4664.       IF ZSubParm = -1 THEN _
  4665.          RETURN 10595
  4666.       ZUserXferDefault$ = ZWasFT$
  4667. 42810 ZOutTxt$ = "Protocol: " + ZProtoPrompt$
  4668.       GOSUB 12979
  4669.       RETURN
  4670. '
  4671. ' *  C - COMMAND FROM UTILITY MENU (CHANGE CASE Toggle)
  4672. ' *  UPPER/LOWER CASE SET FOR NEW USERS
  4673. '
  4674. 42850 CALL ReportEcho
  4675. 42851 ZOutTxt$ = "Change to R)BBS, C)aller's software" + _
  4676.            MID$(", I)ntermediate host",1,-20 * (ZHostEchoOn$ <> "")) + _
  4677.            ZPressEnterExpert$
  4678.       GOSUB 12930
  4679.       IF ZWasQ = 0 THEN _
  4680.          RETURN
  4681. 42852 ZWasZ$ = LEFT$(ZUserIn$(ZAnsIndex),1)
  4682.       CALL AllCaps (ZWasZ$)
  4683.       IF INSTR("ICR",ZWasZ$) = 0 THEN _
  4684.          GOTO 42851
  4685.       ZEchoer$ = ZWasZ$
  4686.       CALL SetEcho (ZEchoer$)
  4687.       CALL ReportEcho
  4688.       RETURN
  4689. ' *  G - COMMAND FROM UTILITY MENU (GRAPHICS WANTED)
  4690. ' *  Graphic MENUS SELECTION SET FOR NEW USERS
  4691. '
  4692. 43000 GOSUB 43005
  4693.       GOTO 43022
  4694. 43005 CALL AskGraphics
  4695.       IF ZSubParm = -1 THEN _
  4696.          RETURN 10595
  4697.       IF ZWasQ = 0 THEN _
  4698.          RETURN
  4699. 43020 ZOutTxt$ = "Text Graphics: " + _
  4700.            MID$("None AsciiColor",ZWasGR * 5 + 1,5)
  4701.       GOSUB 12979
  4702.       RETURN
  4703. 43022 ZPrevPUI$ = ""
  4704.       IF ZEmphasizeOnDef$ = "" THEN _
  4705.          RETURN
  4706.       ZOutTxt$ = "Do you want colorized prompts ([Y],N)"
  4707.       GOSUB 12999
  4708.       ZHiLiteOff = NOT ZNo
  4709.       CALL Toggle(5)
  4710.       RETURN
  4711. 43025 CALL Graphic (ZUserGraphicDefault$,ZFileName$)
  4712. '
  4713. ' *  DISPLAY NON-BREAKABLE TEXT FILES
  4714. '
  4715. 43027 ZStopInterrupts = ZTrue
  4716.       CALL BufFile (ZFileName$,WasX)
  4717.       CALL Carrier
  4718.       IF ZSubParm = -1 THEN _
  4719.          RETURN 10595
  4720.       ZStopInterrupts = ZFalse
  4721.       RETURN
  4722. '
  4723. ' * MAKE INPUT STRING HIDDEN (USE *'S TO ECHO INPUT)
  4724. '
  4725. 45010 ZHidden = ZTrue
  4726.       GOSUB 12995
  4727.       ZHidden = ZFalse
  4728.       RETURN
  4729.